Мне нужно зарегистрировать функцию-член, используя luabind, которая должна принимать lua-функцию в качестве параметра. Для любой нормальной функции я бы обычно делал это:
int SomeLuaFunction(lua_State *l)
{
luaL_checkfunction(l,1);
int fc = luaL_ref(l,LUA_REGISTRYINDEX);
[...]
}
Luabind, однако, использует список параметров, поэтому я не уверен, как сказать, что ожидаю функцию:
void Lua_ALSound_CallOnStateChanged(lua_State *l,boost::shared_ptr<ALSound> pAl,<function-parameter?>)
{
[...]
}
lua_bind(luabind::class_<ALSound COMMA boost::shared_ptr<ALSound>>("ALSound")
.def("CallOnStateChanged",&Lua_ALSound_CallOnStateChanged)
);
(Здесь показана только соответствующая часть кода, lua_bind использует luabind :: module)
Луа-пример того, что я пытаюсь сделать:
local al = ALSound() -- I'm aware this wouldn't work since I haven't defined a constructor
al:CallOnStateChanged(function()
[...]
end)
Возможно, есть способ добавить дополнительные функции в уже зарегистрированный класс без luabind? Мы ценим любые предложения.
Если вы хотите иметь функцию, которая принимает объекты Lua в качестве параметров, вы должны иметь функцию взять luabind::object
в качестве параметра. Затем вы можете проверить, является ли это функцией, и вызвать ее, если она есть.
Других решений пока нет …