Помогите с форсированной привязкой / функциями - PullRequest
1 голос
/ 12 сентября 2009

У меня есть подпись этой функции, которую я должен соответствовать

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

Вот что у меня есть:

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

Однако на lua_register(_luaState... он все еще жалуется на проблемы с конверсией

Ошибка 1, ошибка C2664: 'lua_pushcclosure': не может конвертировать параметр 2 из 'boost :: function' для 'Lua_CFunction'

Кто-нибудь знает, как это можно решить?

Ответы [ 2 ]

4 голосов
/ 12 сентября 2009

Это не может быть решено напрямую. Lua API требует от вас простых указателей на функции - это просто указатель кода и ничего больше. Между тем, boost::function является функциональным объектом, и его никак нельзя преобразовать в простой указатель на функцию, поскольку, грубо говоря, он захватывает не только код, но и состояние. В вашем примере захваченным состоянием является значение self. Таким образом, у него есть указатель кода для кода и некоторые данные - и целевой API ожидает только указатель кода.

1 голос
/ 12 сентября 2009

Проблема в том, что компилятор не может определить параметр шаблона, поскольку существует неявное преобразование.

Вам необходимо сохранить указатель функции в объекте функции.

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

И ваша функция ожидает возвращаемый тип void, который также необходимо изменить на int.

...