std::tr1::function -> Funktionspointer
-
Hallo,
Ich habe folgenden Code:typedef void (*FuncType)(void*); class Class { FuncType F; void foo(void *UserData) {/**/} void binde() { std::tr1::function<void(void*)> f = std::tr1::bind(&Class::Foo, this, std::tr1::placeholders::_1); F = f; //Fehler } };Der oben genannte Fehler ist, std::tr1::function könne nicht nach FuncType konvertiert werden.
Wie kann man das Problem lösen?
Danke schon im Voraus!
mfg
Mr X
-
Du kannst natürlich einem einfachen Funktionszeiger kein generisches Callable wie
std::tr1::functionzuweisen, dafür ist dieses viel zu komplex. Wenn du unbedingt einen Funktionszeiger brauchst, schreibe dir eine Funktion dafür. Aber wieso arbeitest du nicht gleich mitstd::tr1::functionweiter?
-
Ich würde zu gerne mit std::tr1::function weiterarbeiten. Leider will SFML einen normalen Funktionspointer.
Kann man vielleicht mit bind1st die Memberfunktion binden und dies dann konvertieren?
-
Mr X schrieb:
Leider will SFML einen normalen Funktionspointer.
Wo genau brauchst du das? Bei
sf::Thread? Dort bestünde ja eine Alternative darin, von der Klasse zu erben.Mr X schrieb:
Kann man vielleicht mit bind1st die Memberfunktion binden und dies dann konvertieren?
Mit den Dingen aus
<functional>kannst du nur Funktionsobjekte erzeugen, keine Funktionen. Das musst du in C++ nach wie vor von Hand erledigen.Aber du kannst dir ja statt von
std::tr1::bind()einen Funktor erzeugen lassen eine eigene Funktion schreiben?// Packt die Aufrufklasse und die Daten zusammen struct Data { Class* c; // Verweis auf deine Klasse ActualData d; // Deine eigentlichen Transportdaten (evtl. auch Zeiger) }; void ThreadFunction(void* UserData) { Data* MyData = static_cast<Data*>(UserData); MyData.c->foo(MyData.d); }
-
Danke für die Antwort.
Ich habe jetzt die UserData-Variable zur Übergabe des this-Zeigers verwendet und die Run-Methode statisch gemacht. Funktioniert jetzt.
mfg
Mr X