Question

I have this function signature I have to match

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

Here's what I have so far:

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

However, at lua_register(_luaState..., it's still complaining about conversion issues

Error 1 error C2664: 'lua_pushcclosure' : cannot convert parameter 2 from 'boost::function' to 'lua_CFunction'

Anyone know how this can be solved?

Was it helpful?

Solution

This cannot be solved directly. Lua API wants a plain function pointers from you - that's just a code pointer, and nothing else. Meanwhile, boost::function is a function object, and there's no way it could possibly be convertible to a plain function pointer, because - roughly speaking - it captures not just the code, but also the state. In your example, the captured state is the value of self. So it has a code pointer for the code, and some data - and the target API expects just the code pointer.

OTHER TIPS

The problem is that the compiler cant deduce the template parameter because there is an implicit conversion.

You need to store the function pointer into a function object.

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

And your function expects a void return type and that is needed to change to int too.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top