[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.