メンバー関数をネストされたクラスの別の関数に渡そうとしています。C++非静的メンバー関数のバインド
非メンバ関数がうまく動作しますが、メンバーを渡すと、コンパイルされません渡す:
ああ:class A
{
class B
{
B();
~B();
doSomething();
};
class C
{
C();
~C();
execute(function<void(void)> func);
};
C *myC;
map<int, B> myMap;
}
A.cpp:
void A::member(int param)
{
A::myMap[param].doSomething();
}
void nonA_func(int param)
{
...
}
void A::caller()
{
myC->execute(bind(nonA_func, 42)); // OK
myC->execute(bind(A::member, 42)); // COMPILER ERROR 1
myC->execute(A::myMap[42].doSomething()); // COMPILER ERROR 2
}
A::main()
{
myC = new A::C();
// filling myMap
caller();
myMap.clear();
delete C;
}
次のようにコンパイルする場合COMPILER ERROR 1
が発生しました:
実際にstatic
としてA::member
を定義
は、この問題を解決するが、その後、私はもうmyMap
にアクセスすることはできません。 非静的メンバー関数をどのようにバインドできますか?
私もCOMPILER ERROR 2
その結果、直接呼び出される関数を渡すことを試みた:
invalid use of void expression myC->execute(A::myMap[42].doSomething()); ^
「実行しない(関数 func; 'が欠落しています)'はありませんか?私が推測しているのは... –
urban
サイドノート: 'bind'は恐ろしいですが、可能であればlambdaを避けてください。確かにここで可能です。 –
@VioletGiraffeはひどい*過言ではありませんか? – krzaq