Aiuto con boost bind / funzioni
-
06-07-2019 - |
Domanda
Ho questa firma della funzione che devo abbinare
typedef int (*lua_CFunction) (lua_State *L);//target sig
Ecco quello che ho finora:
//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);
}
Tuttavia, su lua_register (_luaState ...
, si sta ancora lamentando dei problemi di conversione
Errore 1 errore C2664: 'lua_pushcclosure': impossibile convertire parametro 2 da 'boost :: function' in 'Lua_CFunction'
Qualcuno sa come risolverlo?
Soluzione
Questo non può essere risolto direttamente. L'API Lua vuole un semplice puntatore a funzione: è solo un puntatore a codice e nient'altro. Nel frattempo, boost :: function
è un oggetto funzione, e non c'è modo che possa essere convertibile in un semplice puntatore a funzione, perché - in termini approssimativi - cattura non solo il codice, ma anche lo stato. Nel tuo esempio, lo stato acquisito è il valore di self
. Quindi ha un puntatore di codice per il codice e alcuni dati - e l'API di destinazione prevede solo il puntatore di codice.
Altri suggerimenti
Il problema è che il compilatore non può dedurre il parametro template perché c'è una conversione implicita.
È necessario memorizzare il puntatore a funzione in un oggetto funzione.
function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);
E la tua funzione prevede un tipo di ritorno vuoto e che è necessario cambiare anche in int.