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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top