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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top