Question

Je dois faire correspondre cette signature de fonction

typedef int (*lua_CFunction) (lua_State *L);//target sig

Voici ce que j'ai jusqu'à présent:

    //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);
}

Cependant, à lua_register (_luaState ... ), les plaintes concernant les problèmes de conversion se font toujours

.
  

Erreur 1 erreur C2664:   'lua_pushcclosure': impossible de convertir   paramètre 2 de   'boost :: function' à   'lua_CFunction'

Quelqu'un sait-il comment résoudre ce problème?

Était-ce utile?

La solution

Cela ne peut pas être résolu directement. Lua API veut des pointeurs de fonction simples - ce n'est qu'un pointeur de code, et rien d'autre. Pendant ce temps, boost :: function est un objet de fonction, et il ne peut en aucun cas être converti en un simple pointeur de fonction, car, grosso modo, il ne capture pas seulement le code, mais également l'état. Dans votre exemple, l'état capturé est la valeur de self . Donc, il a un pointeur de code pour le code et des données - et l’API cible attend seulement le pointeur de code.

Autres conseils

Le problème est que le compilateur ne peut pas déduire le paramètre de modèle car il existe une conversion implicite.

Vous devez stocker le pointeur de fonction dans un objet de fonction.

function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);

Et votre fonction attend un type de retour vide, qui est également nécessaire pour passer à int.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top