Передайте объект C++ функции Lua

У меня есть проект C++, где 1 метод 1 класса изменяется очень часто. Таким образом, я хочу взять тот код от C++ до Lua. Отметьте, я - новичок к Lua.

Целая задача:

  1. Свяжите некоторые методы класса для конечного автомата Lua;
  2. Ссылка передачи на объект класса к функции, записанной в Lua;
  3. Действуйте с переданным объектом C++ в функции Lua.

Я нашел, как сделать первый шаг с Лунным, и не могу справиться второй и третий.

Я не могу использовать БОЛЬШОЙ ГЛОТОК и повышение.

7
задан sth 5 April 2010 в 21:46
поделиться

3 ответа

//This has a large number of steps, but I'm gonna post them all. This is all using native Lua 5 and the lua CAPI.
int CreateInstanceOfT(lua_State* L) {
    new (lua_newuserdata(L, sizeof(T))) T(constructor args);
    return 1;
}
int CallSomeFuncOnT(lua_State* L) {
    if (lua_istable(L, 1)) { // If we're passed a table, get CData
        lua_getfield(L, 1, "CData");
        lua_replace(L, 1);
    }
    if (!lua_touserdata(L, 1))
        lua_error(L); // longjmp out.
    T& ref = *(T*)lua_touserdata(L, 1);
    ref.SomeFunc(); // If you want args, I'll assume that you can pass them yourself
    return 0;
}
int main() {
    lua_State* L = luaL_newstate();
    lua_pushcfunction(L, CreateInstanceOfT);
    lua_setglobal(L, "CreateInstanceOfT");
    lua_pushcfunction(L, CallSomeFuncOnT);
    lua_setglobal(L, "CallSomeFuncOnT");
    luaL_dofile(L, "something.lua");
    lua_close(L);
}
-- Accompanying Lua code: semicolons are optional but I do out of habit. In something.lua
function CreateCInstance()
    local Instance = {
        CData = CreateInstanceOfT();
        SomeFunc = CallSomeFuncOnT;
    }
    return Instance;
end

local object = CreateCInstance();
object:SomeFunc(); // Calls somefunc.

Я мог бы опубликовать большое количество подробностей о том, как упростить разоблачение, как сделать наследование и т.п. - и это нужно будет изменить, если вы хотите выставить более одного T (я думаю, что наиболее распространенным решением является простая сделка struct {std :: auto_ptr , int type} ). Но это должно быть отправной точкой, если вы ничего не понимаете в этом процессе.

Сначала мы просим Lua выделить некоторое пространство (пользовательские данные), а затем помещаем туда T.Когда появляется CallSomeFuncOnT, сначала мы спрашиваем его, есть ли у нас таблица (многие классы Lua основаны на таблицах, поскольку они поддерживают объектную ориентацию, метатаблицы и т. Д.), И получаем пользовательские данные, которые затем конвертируем в указатель на наш объект, а затем преобразовать в ссылку. Помните, что lua_touserdata дает вам void *, поэтому вам лучше быть чертовски уверенным в том, что находится на другом конце. Затем мы вызываем somefunc и возвращаемся. В Main мы просто регистрируем функции как глобальные.

Теперь в Lua, когда вы вызываете CreateInstanceOfT, он фактически просто вызывает конструктор T, прозрачно для пользователя Lua. Затем мы помещаем его в таблицу, что проще для новичков в Lua, и вызываем SomeFunc, передавая ему эту таблицу.

8
ответ дан 7 December 2019 в 01:19
поделиться

Как и Джон, я использовал luabind и рекомендую его. Однако, поскольку использование ускорения не подходит для вас, вы можете найти список библиотек на этой странице полезным. Вы также можете посетить страницу DoItYourselfCppBinding в вики для пользователей lua .

Одна из библиотек, упомянутых на странице, - это oolua , которая не имеет зависимостей (так сказано).

1
ответ дан 7 December 2019 в 01:19
поделиться

Вы взяли посмотреть на luabind ? Это упрощает предоставление LUA объектов и функций C ++.

1
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: