function pointer auf Memberfunktion mit Argumenten
-
Hi,
Wie muss ich meinen Funktionzeiger definieren, dass folgendes funktioniert?class Test { public: void funktion_1( char c, const string& str ) { } void funktion_2( char c, const string& str ) { } void bar( /*function pointer */, char c, const string& str ) { // Nun will ich mit dem function pointer entweder funktion_1 oder funktion_2 aufrufen. } void foo() { bar( funktion_1, 'x', "hallo welt" ); bar( funktion_2, 'y', "nochmal" ); } }; int main() { Test t; }Danke im Voraus.
-
Mein Favorit:
void bar(void (*funktion)( char c, const string& str ), char c, const string& str ) { funktion(c, str); }Alternative (halte ich für Obfuscation):
typedef void (*VoidCharStringFunction)(char c, const string& str); void bar(VoidCharStringFunction funktion, char c, const string& str ) { funktion(c, str); }Alternative (halte ich für Obfuscation):
using VoidCharStringFunction = void (*)(char c, const string& str); void bar(VoidCharStringFunction funktion, char c, const string& str ) { funktion(c, str); }Alternative (kostet Laufzeit, funktioniert dafür aber mit Lambdas und Objekten):
void bar(std::function<void(char, const string &)> funktion, char c, const string& str ) { funktion(c, str); }
-
void bar(void funktion( char c, const string& str ), char c, const string& str ) { funktion(c, str); }Funktioniert auch.
-
Achtung, die Methoden sind nicht statisch! Daher braucht man Methodenzeiger und nicht Funktionszeiger.
class Test { public: void funktion_1(char c, const std::string& str) { } void funktion_2(char c, const std::string& str) { } void bar(void(Test::*funktion)(char, const std::string&), char c, const std::string& str) { // Nun will ich mit dem function pointer entweder funktion_1 oder funktion_2 aufrufen. (this->*funktion)(c, str); } void foo() { bar(&Test::funktion_1, 'x', "hallo welt"); bar(&Test::funktion_2, 'y', "nochmal"); } };
-
Danke, das von asdflol hat funktioniert.
(this->*funktion)Darauf wäre ich nie gekommen:D
-
Das ist auch gar nicht so ganz einfach und gebräuchlich wie ich finde. Wenn ein problem schon abstrahiert wird, dann schlage ich auch gerne mal mit std::function + std::bind drauf ein.
Dann ist wenigstens der Aufruf wieder schön hübsch.