[Gelöst] pointer as template arg in template class



  • moin,

    noch ein Problem und zwar habe ich mir diverse prozeduren angeguckt um das Problem mit den Memberfunction-pointern zu lösen. Eine Lösung war eine wrapper-methode um den memberpointer herum zu bauen, was ich gerade versuche.

    template<class T>
    		inline void Bind(ret (CALLTYPE T::*_ptr) (Arguments), T* target)
    		{
    			ptr = &objectCall<T,_ptr>;
    		}
    
    	protected:
    		template<class T, ret (CALLTYPE T::*_ptr) (Arguments)>
    		static ret CALLTYPE objectCall(void* object Seperator InvokeArgs)
    		{ 
    			//call to the member function here
    			return 0; 
    		};
    

    Nur leider wirft mir der Compiler immer wieder die Fehlermeldung, dass eine overloaded-function nicht in die angegebene Form konvertiert werden kann. Liegt das eventuell daran, dass die Bind-Methode nicht static ist?

    Wenn ja, gibt es da eventuell ein Workaround um doch von der nicht-Static funktionen eine solche warppermethode zu produzieren?



  • das Problem mit den Memberfunction-pointern zu lösen

    Kenne keine Probleme damit.

    static ret CALLTYPE objectCall(void* object Seperator InvokeArgs)
    

    Was ist das?

    Ansonsten: std::function, std::bind!



  • knivil schrieb:

    Was ist das?

    meine wrapper-methode !?



  • Solch eine Signatur habe ich in C++ noch nie gesehen, allein die 3 Variablennamen hinter dem Typen void* ist seltsam.



  • ach so, wenn das template genutzt wird sieht das in meinem konkreten Anwendungsfall natürlich so aus

    mytemp<void ()> mytmp;
    mytmp.Bind<Window>(&Window::BeginScene, Window);
    
    //woraus folgt
            inline void Bind(void (Window::*_ptr) (), Window* target)
            {
                ptr = &objectCall<Window,_ptr>;
            }
    
        protected:
            //-><Window, void (Window::*_ptr) ()>
            static void objectCall(void* object)
            {
                //call to the member function here
                return 0;
            };
    

    die Definitionen sind Macros und Defines für die erzeugung der spezielisierungen für die Templateklasse

    Der Compiler wirft übrigens immer folgende Fehlermeldung

    Fehler	5	error C2440: '=': 'overloaded-function' kann nicht in 'void (__cdecl *)(void *)' konvertiert werden
    


  • OK ich hab das Problem gefunden, die Bind()-Methode darf keinen Instanzpointer übergeben sondern die Signatur.

    _ptr aus der Argumentliste in die Vorlagenliste verschoben und es geht ohne Probleme.



  • Benutz std::function.


Log in to reply