Comment appeler pointeur vers une fonction membre quand il est un membre de données de classe?
-
26-10-2019 - |
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) (...)’
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:
La syntaxe est tout à fait naturelle, mais une conséquence de la priorité de C Règlement ...
(obj.*obj.pf)(1, 2);