メンバー関数へのポインターを呼び出す方法クラスのデータメンバーの場合はどうすればよいですか?
-
26-10-2019 - |
質問
struct B
{
void (B::*pf)(int, int); // data member
B () : pf(&B::foo) {}
void foo (int i, int j) { cout<<"foo(int, int)\n"; } // target method
};
int main ()
{
B obj;
// how to call foo() using obj.pf ?
}
上記のテストコードでは、 pf
のデータメンバーです B
. 。それを呼び出すための文法ルールは何ですか?それは簡単なはずですが、私は適切な試合を得ていません。例えば、私が試してみると obj.*pf(0,0);
それから私は得ます:
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
解決
このような:
(obj.*obj.pf)(0, 1);
メンバーアクセス(.
)メンバーオペレーターへのポインターよりも優先されるため、これは以下に相当します。
(obj.*(obj.pf))(0, 1);
関数呼び出しは、メンバーオペレーターへのポインターよりも優先されるため、できません。
obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)
それは次のことに相当するでしょう。
obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
// pointer to member
他のヒント
PFはメソッドポインターであり、それが指す方法を呼び出したいので、使用する必要があります
(obj.*obj.pf)(1, 2);
それはあなたがPFで指摘された方法を呼び出すオブジェクトobjと書かれています
ここで結果を参照してください:
構文は非常に不自然ですが、C ++優先順位ルールの結果です...
(obj.*obj.pf)(1, 2);
所属していません StackOverflow