Hilfe mit Boost-bind / Funktionen
-
06-07-2019 - |
Frage
Ich habe diese Funktion Unterschrift muss ich passen
typedef int (*lua_CFunction) (lua_State *L);//target sig
Hier ist, was ich bisher:
//somewhere else...
...
registerFunction<LuaEngine>("testFunc", &LuaEngine::testFunc, this);
...
//0 arg callback
void funcCallback0(boost::function<void ()> func, lua_State *state)
{
func();
}
template<typename SelfType>
void registerFunction(const std::string &funcName, boost::function<void (SelfType*)> func, SelfType *self)
{
//funcToCall has to match lua_CFunction
boost::function<void (lua_State *)> funcToCall = boost::bind(&LuaEngine::funcCallback0, this,
boost::bind(func, self), _1);
lua_register(_luaState, funcName.c_str(), funcToCall);
}
Doch bei lua_register(_luaState...
, es beschwert sich immer noch über Konvertierungsprobleme
Fehler 1 Fehler C2664: ‚Lua_pushcclosure‘: Konvertierung Parameter 2 aus 'Boost :: function' zu 'Lua_CFunction'
Wer weiß, wie diese gelöst werden?
Lösung
Das kann nicht direkt gelöst werden. Lua API will eine Ebene Funktionszeiger von Ihnen - das ist nur ein Code-Zeiger, und nichts anderes. Inzwischen boost::function
ist ein Funktionsobjekt, und es gibt keine Möglichkeit, es möglicherweise umwandelbar in einen einfachen Funktionszeiger sein könnte, weil sie - grob gesprochen - es fängt nicht nur den Code, sondern auch den Staat. In Ihrem Beispiel ist der erfasste Zustand der Wert self
. So ist es ein Code-Zeiger für den Code hat, und einige Daten -. Und der Ziel-API erwartet nur den Code Zeiger
Andere Tipps
Das Problem ist, dass der Compiler kann nicht die Template-Parameter ableiten, weil es eine implizite Konvertierung ist.
Sie müssen die Funktionszeiger in eine Funktion Objekt speichern.
function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);
Und Ihre Funktion erwartet einen Rückgabetyp void und was nötig ist, um auch in int geändert werden.