Question

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 ?
}

Dans le code de test ci-dessus, pf est un élément de données de B. Quelle est la règle de grammaire pour l'invoquer? Il devrait être simple, mais je ne reçois pas un bon match. par exemple. Si je tente obj.*pf(0,0); je reçois:

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
Était-ce utile?

La solution

Comme ceci:

(obj.*obj.pf)(0, 1);

Accès membre (.) a une priorité supérieure à un pointeur à l'opérateur membre si cela équivaut à:

(obj.*(obj.pf))(0, 1);

Parce que l'appel de fonction a aussi une priorité supérieure à un pointeur à l'opérateur de membre, vous ne pouvez pas faire:

obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)

Comme cela équivaudrait à:

obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
                    // pointer to member

Autres conseils

est un pointeur pf de la méthode, et que vous voulez appeler la méthode il pointe, de sorte que vous devez utiliser

(obj.*obj.pf)(1, 2);

Il dit l'objet obj invoquez la méthode pointée par pf

Voir le résultat ici:

http://ideone.com/p3a5G

La syntaxe est tout à fait naturelle, mais une conséquence de la priorité de C Règlement ...

(obj.*obj.pf)(1, 2);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top