Methodenpointer und Templates



  • Moin moin,

    ich möchte einen Pointer auf eine Templatemethode setzen, die selbst Member einer Templateklasse ist.

    // Methode, die den Funktionspointer ausnehmen soll
    // als template um Pointer auf Methoden verschiedener Klassen aufnehmen zu können
    template <typename T>
    void
    setCallBack( void(T::*pointerToCallBack)(), T* pointerToObject )
    {
    	// do something to save the funktion pointer
    }
    
    class Test {
    	public:		
    		template< unsigned int ID >
    		void
    		f() {
    			setCallBack( &Test::f< ID >, this );
    		};
    };
    
    template< typename T >
    class Test2 {
    	public:		
    		void
    		g() {
    			setCallBack( &Test2< T >::g, this );
    		};
    
    		template< unsigned int ID >
    		void
    		f() {
    			setCallBack( &Test2< T >::f< ID >, this );
    		};
    };
    

    Die Methoden setzen einen CallBack auf sich selbst, indem der Methodenpointer an die Funktion setCallBack übergeben wird.

    Die Variante nichttemplate Klasse + Template Methode (Test::f), sowie im getauschten Fall, Templateklasse + nicht template Methode (Test2::g) kompilieren. Nur im Fall von Test2::f ist der Kompiler unzufrieden:

    expected primary-expression before »,« token
    

    Jemand eine Idee?

    cu
    Thundernail



  • Also ich kann dir nicht direkt helfen, aber ich habe das auch mal gemacht.

    template<class t> void  foo(t* pt,void (t::* f)() ) { (pt->*f) ();}
    

    Diese Funktion (die auch eine Memberunktion sein kann), übernimmt einen Zeiger auf eine beliebeige Klasse, sowie einen Funktionszeiger. Den du dann so aufrufen kannst.



  • Moin moin,

    anscheinend hab ich mich etwas undeutlich ausgedrückt. 😞

    Ich habe kein Problem mit der Implementation der Funktion setCallBack, die habe ich nur weggelassen, weil sie recht komplex ist.

    Der Kompiler streikt schon beim Aufruf der Funktion. Allerdings nur wenn zwei Templateparameter (für die Klasse und die Methode) übergeben werden. Solange nur die Klasse _oder_ die Methode ein Template ist, funktioniert der Aufruf.



  • Also ich bekomme einen Fehler, wenn ich Test, oder Test2 einfach mal so ein Objekt erstelle:

    error C2143: Syntaxfehler: Es fehlt ';' vor '<'

    Konnte es bis jetzt noch nicht isolieren, wo er das genau meint.

    EDIT:
    Hm, also das mit dem Fehler war was anderes. Habe gedacht, dass beides Templateklassen sind. 😃

    Aber jetzt bekomme ich keine Fehler mehr.

    PS.
    Von welcher Programmiersprache kommst du? - Dein Stil ist ja.. sehr "anderst" 😃



  • Ich denke mal, dass da was mit template<unsigned int ID> nicht stimmt.
    Ich weiss sowieso nicht, was das genau soll. 🙄
    Also meiner Meinung nach macht das auch nicht viel Sinn.
    Wenn ich das nämlich in template<typename ID> ändere, funktioniert der Code..


  • Mod

    template< typename T >
    class Test2 {
    ...
    		template< unsigned int ID >
    		void
    		f() {
    			setCallBack( &Test2::template f< ID >, this );
    		};
    ...
    


  • drakon schrieb:

    Ich denke mal, dass da was mit template<unsigned int ID> nicht stimmt.
    Ich weiss sowieso nicht, was das genau soll. 🙄

    Das ist eine alternative zu f(unsigned int id). Bei der Templateversion wird für jede ID eine eigene Methode vom Kompiler erstellt, wodurch ich für jede ID einen eigenen Methodenpointer bekomme. Dazu muss natürlich die ID beim Aufruf zur Kompilierzeit.
    Ich glaube nicht, dass es daran liegt, weil ich Test::f problemlos kompiliert bekomme.
    Der Aufruf von Test::f sieht dann übrigens so aus:

    int main() {
        Test test;
        test.f< 1 >();
    }
    

    drakon schrieb:

    PS. Von welcher Programmiersprache kommst du? - Dein Stil ist ja.. sehr "anderst" 😃

    Wie meist du das? Ich mach zwar auch das ein oder andere in PHP aber hauptsächlich ist das schon C++. 🤡



  • camper schrieb:

    template< typename T >
    class Test2 {
    ...
    		template< unsigned int ID >
    		void
    		f() {
    			setCallBack( &Test2::template f< ID >, this );
    		};
    ...
    

    Der "selbsterklärende" Aufbau von C++ 😉

    Vielen Dank camper, das hätte ich bestimmt nicht versucht 🙂


Anmelden zum Antworten