Зарегистрируйте нестатические методы C ++ в Lua - PullRequest
3 голосов
/ 09 сентября 2011

Я пытаюсь создать небольшую систему на C ++ / Lua, где я буду создавать свои объекты и привязывать к ним поведение в Lua.Сейчас я использую LuaWrapper (небольшой заголовок с базовыми C ++ для Lua вещами), моя проблема в том, что, насколько я вижу, Lua позволяет мне регистрировать только статические методы класса (или нестатические функции), небольшое исследование ипонял, потому что Lude typedef ожидает метод только с одним параметром lua_State* L, а нестатические методы имеют неявный this.

Я надеялся найти способ решить эту проблему без зависимости от других библиотек, всеМне нужны нестатические классы / свойства в Lua, поэтому я не вижу причин использовать LuaBind + Boost или другие обертки с сильной зависимостью.

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

LuaWrapper не предназначен для непосредственного подключения к нестатическим функциям в классе. Я предполагаю, что это может быть с какой-то особой хитростью, но вот как я спроектировал это для использования:

static int Widget_AddChild(lua_State* L)
{
    Widget* parent = luaW_check<Widget>(L, 1);
    Widget* child = luaW_check<Widget>(L, 2);
    if (parent && child)
    {
        lua_pushboolean(L, parent->AddChild(child));
        return 1;
    }
    return 0;
}

// ...

static luaL_reg Widget_metatable[] =
{
    { "AddChild", Widget_Addchild },
    // ...
    { NULL, NULL }
};

Я обычно храню нелипа в отдельном файле. В этом случае Widget.cpp / hpp. Затем у меня есть файл LuaWidget, который содержит только такие привязки, которые я пишу по мере необходимости. (У меня также есть несколько фрагментов кода для быстрого и безболезненного написания этих функций. Если вы используете vim, я буду рад поделиться ими)

1 голос
/ 09 сентября 2011

Возможно, вы захотите изучить использование toLua ++ (http://www.codenix.com/~tolua/).

Может анализировать определения классов и выводить файл кода c ++, чтобы сделать нестатические члены класса доступными в Lua.

1 голос
/ 09 сентября 2011

Вы можете создать статическую функцию, которая будет принимать экземпляр класса и аргумент и вызывать эту функцию в экземпляре:

void func_static(MyClass* inst, T arg) {
    inst->func(arg);
}

Затем зарегистрируйте функцию для вызова этой функции в качестве мета-функции, чтобы вы могли сделать это в lua

blah:x(y)

, которая вызовет функцию, которая получит пользовательские данные, которые содержит blah, а также аргумент y и вызовет func_static с blah и y.

0 голосов
/ 13 сентября 2011

Вы также можете взглянуть на LuaCppWrapper .Он предназначен только для простых привязок.Если вам нужно полноценное решение, возможно, вам понадобятся OOLua или Simple Lua Binder.

...