Aide avec boost bind / fonctions
-
06-07-2019 - |
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?
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.