std::bind
私はプライベートベースクラスのメンバ関数に派生クラスのusing
-declarationで "public"を作成したいと思います。関数が直接働く呼び出し、それがコンパイルされないメンバ関数ポインタを使用して結合または思わ: 非公開継承メンバ関数へのバインド
#include <functional>
struct Base {
void foo() { }
};
struct Derived : private Base {
using Base::foo;
};
int main(int, char **)
{
Derived d;
// call member function directly:
// compiles fine
d.foo();
// call function object bound to member function:
// no matching function for call to object of type '__bind<void (Base::*)(), Derived &>'
std::bind(&Derived::foo, d)();
// call via pointer to member function:
// cannot cast 'Derived' to its private base class 'Base'
(d.*(&Derived::foo))();
return 0;
}
は、上記のエラーメッセージを見ると、「問題が
Derived::foo
はまだちょうど
Base::foo
であることのようだ、と私はすることができますアクセス
Base
から
Derived
Derived
の外側にアクセスしてください。
これは矛盾しているようです - 私はダイレクトコール、バウンド関数、および関数ポインタを同じ意味で使用できないはずですか?
私は、好ましくは、(私が所有していないライブラリ内にある)Base
またはDerived
を変更せずに、Derived
オブジェクト上foo
にバインドせてしまうの回避策はありますか?
回避策として、ラムダ '[&d](){d.foo();}を使うことができます。 } '。 – Holt