Pregunta

Tengo esta firma de función que debo hacer coincidir

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

Esto es lo que tengo hasta ahora:

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

Sin embargo, en lua_register (_luaState ... , todavía se queja de problemas de conversión

  

Error 1 error C2664:   'lua_pushcclosure': no ??se puede convertir   parámetro 2 de   'boost :: function' a   'lua_CFunction'

¿Alguien sabe cómo se puede resolver esto?

¿Fue útil?

Solución

Esto no se puede resolver directamente. Lua API quiere un puntero de función simple de usted, eso es solo un puntero de código, y nada más. Mientras tanto, boost :: function es un objeto de función, y no hay forma de que pueda convertirse en un puntero de función simple, porque, en términos generales, captura no solo el código, sino también el estado. En su ejemplo, el estado capturado es el valor de self . Por lo tanto, tiene un puntero de código para el código y algunos datos, y la API de destino solo espera el puntero de código.

Otros consejos

El problema es que el compilador no puede deducir el parámetro de plantilla porque hay una conversión implícita.

Necesita almacenar el puntero de función en un objeto de función.

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

Y su función espera un tipo de retorno nulo y eso también es necesario para cambiar a int.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top