Ajuda com reforço de vinculação / funções
-
06-07-2019 - |
Pergunta
Eu tenho essa assinatura da função que eu tenho que corresponder
typedef int (*lua_CFunction) (lua_State *L);//target sig
Aqui está o que eu tenho até agora:
//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);
}
No entanto, a lua_register(_luaState...
, é ainda reclamando sobre problemas de conversão
Erro 1 erro C2664: 'Lua_pushcclosure': não pode converter parâmetro 2 de ':: função boost' para 'Lua_CFunction'
Alguém sabe como isso pode ser resolvido?
Solução
Isto não pode ser resolvido diretamente. Lua API quer uma planície ponteiros de função de você - que é apenas um ponteiro de código, e nada mais. Enquanto isso, boost::function
é um objeto de função, e não há nenhuma maneira que poderia ser conversível para um ponteiro de função simples, porque - a grosso modo - que capta não apenas o código, mas também o estado. No seu exemplo, o estado capturado é o valor de self
. Por isso, tem um ponteiro código para o código, e alguns dados -. E espera-alvo API apenas o ponteiro do código
Outras dicas
O problema é que o compilador não pode deduzir o parâmetro do modelo, porque há uma conversão implícita.
Você precisa armazenar o ponteiro de função em um objeto de função.
function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);
E a sua função espera um tipo de retorno void e que é necessária a mudança para int também.