2017-04-17 2 views
0

Wie kann eine Objektmethode aufgerufen werden, die an eine Variable übergeben wird?Übergeben einer Objektmethode an eine Variable

class A { 
public: 
    inline int f() { 
     return 1; 
    } 
}; 


int main() { 
    A a; 

    int (A::*y)(); //'y' must be a method of 'A' class that returns 'int' 
    y = &A::f; //bind 'f' method 

    *y(); //how to invoke??? 
} 

Die anderen thread gebunden, ein Verfahren zu einem Objektfeld, und es wurde auf diese Weise (a.*(a.x))() aufgerufen, aber ich kann nicht einen Weg finden, eine ähnliche Sache zu einer einfachen Variablen zu tun.

Antwort

2

Tun Sie einfach (a.*y)();. Sie benötigen die zusätzlichen Klammern, damit der Compiler den Zeiger auf Element auflöst, bevor der Funktionsaufruf erfolgt. Siehe operator precedence:

class A { 
public: 
    inline int f() { 
     return 1; 
    } 
}; 


int main() { 
    A a; 

    int (A::*y)(); //'y' must be a method of 'A' class that returns 'int' 
    y = &A::f; //bind 'f' method 

    (a.*y)(); 
} 

Demo

+0

Es hat funktioniert! Vielen Dank. – Humberd

+0

Wie kann ich den Namen der Funktion bekommen (in diesem Fall wird es 'f'), die an eine Variable' y' übergeben wurde? – Humberd

+1

@Humberd, es gibt keinen portablen oder einfachen Weg ... Das aktuelle Mittel ist über 'std :: type_info', was dir nicht den Namen geben würde, den du dir erhoffst. Wir hoffen, dass einige Reflektionsvorschläge für C++ 20 durchgehen ... :-) – WhiZTiM

Verwandte Themen