Pointer zu Memberfunktion



  • Ich möchte eine Callback-Funtion mit folgendem Konstruktor implementieren:

    Callback::Callback(Base* sender, void* method)
    

    Wobei sender der Zeiger auf die Instanz des Objekts ist und method der Zeiger auf die Funktion. Geht das? Funktionszeiger gehen leider schon von der Syntax her nicht.



  • Willst du eine Factory einrichten? Erläuter dein Problem vielleicht etwas genauer.

    Falls ja, nimm std::function mit entsprechendem Rückgabetyp.



  • Nein, ich möchte eine Memberfunktion eines Objektes aufrufen können. Mal davon abgesehen, dass ich die Standard-Library grundsätzlich ablehne, würde auch std::function hier nicht helfen. Das ganze muss ohne Angabe von irgendwelchen Templateargumenten gehen. Lediglich zwei Pointer zum Vorhalten der nötigen Informationen wenn möglich. Also in etwa sowas:

    class Base
    {
    public:
    	Base() {};
    
    	/*static*/ void Print()
    	{
    		std::wcout << L"Hello World!" << std::endl;
    	}
    };
    
    int main()
    {
    
    	Base* base = new Base();
    	void* ptr = Base::Print;
    	reinterpret_cast<void(*)()>(ptr)();
    }
    


  • Enumerator schrieb:

    Mal davon abgesehen, dass ich die Standard-Library grundsätzlich ablehne, würde auch std::function hier nicht helfen.

    Ich glaube doch. Du kannst die Argumente, die gleich bleiben, binden, während der Rest als Funktionsparameter angegeben wird. Sag vielleicht mal klar, welche Informationen du bei der Konstruktion des Funktionsobjekts hast, und welche Argumente erst zum Zeitpunkt des Aufrufs. Aus deinem Beispiel kann ich jedenfalls nicht entnehmen, was du vorhast, zumal base gar nirgends benutzt wird.

    Wenn ich dich richtig verstanden habe: Ohne Templates wird das jedenfalls nicht generisch funktionieren. Und ohne Standardbibliothek kannst du das Rad neu erfinden... Nur aus religiösen Motiven würde ich das nicht tun 😉


  • Mod

    Mal davon abgesehen, dass ich die Standard-Library grundsätzlich ablehne

    Mit der Einstellung wirst du nicht weit kommen.

    Das ganze muss ohne Angabe von irgendwelchen Templateargumenten gehen

    Warum?

    reinterpret_cast<void(*)()>(ptr)();
    

    Das erzeugt undefiniertes Verhalten.
    Edit:

    Du kannst die Argumente, die gleich bleiben, binden, während der Rest als Funktionsparameter angegeben wird. Sag vielleicht mal klar, welche Informationen du bei der Konstruktion des Funktionsobjekts hast, und welche Argumente erst zum Zeitpunkt des Aufrufs.

    👍



  • Enumerator schrieb:

    Nein, ich möchte eine Memberfunktion eines Objektes aufrufen können. Mal davon abgesehen, dass ich die Standard-Library grundsätzlich ablehne, würde auch std::function hier nicht helfen. Das ganze muss ohne Angabe von irgendwelchen Templateargumenten gehen. Lediglich zwei Pointer zum Vorhalten der nötigen Informationen wenn möglich.

    Pro Satz 2 mal Facepalm


  • Mod

    #include <iostream>
    
    struct foo
    {
        void bar() { std::cout << "foo::bar\n"; }
    };
    
    int main()
    {
        foo x;
        void (foo::*ptr)() = &foo::bar;
        (x.*ptr)(); 
    }
    

    Ausgabe ohne Standardbibliothek ist mir zu umständlich



  • Enumerator schrieb:

    Nein, ich möchte eine Memberfunktion eines Objektes aufrufen können. Mal davon abgesehen, dass ich die Standard-Library grundsätzlich ablehne, würde auch std::function hier nicht helfen. Das ganze muss ohne Angabe von irgendwelchen Templateargumenten gehen. Lediglich zwei Pointer zum Vorhalten der nötigen Informationen wenn möglich. Also in etwa sowas:

    class Base
    {
    public:
    	Base() {};
    
    	/*static*/ void Print()
    	{
    		std::wcout << L"Hello World!" << std::endl;
    	}
    };
    
    int main()
    {
    
    	Base* base = new Base();
    	void* ptr = Base::Print;
    	reinterpret_cast<void(*)()>(ptr)();
    }
    

    Lehn lieber mal new ab.


Log in to reply