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.


Anmelden zum Antworten