メンバー関数へのポインターを呼び出す方法クラスのデータメンバーの場合はどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/6316751

質問

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と書かれています

ここで結果を参照してください:

http://ideone.com/p3a5g

構文は非常に不自然ですが、C ++優先順位ルールの結果です...

(obj.*obj.pf)(1, 2);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top