C ++ и Lua: автоматически регистрировать функции - PullRequest
2 голосов
/ 22 августа 2011

Когда я работал с Lua в C #, я добавлял атрибуты к методам, которые я хотел зарегистрировать в Lua, что-то вроде этого:

// place tile marker
[LuaExport("settilemarker")]
public void SetTileMarker(int x, int y)
{
    TileEditor.X = x;
    TileEditor.Y = y;
}

Затем я использовал бы отражение во время выполнения, чтобы найти все эти функции и автоматически зарегистрировать их с помощью небольшого фрагмента кода, который не нужно было обновлять для каждой новой функции. Это также может быть использовано для автоматического создания списка всех зарегистрированных команд и т. Д.

У меня вопрос, есть ли способ сделать это с Lua в C ++? Как какой-то макрос или что-то в этом роде. Информация не должна быть доступной во время выполнения, я просто хочу, чтобы удобство маркировки каждой функции было там, где она определена, и чтобы все они регистрировались автоматически, вместо того, чтобы иметь один длинный раздел где-то в lua_register (..) s.

Я уже нашел некоторые инструменты, которые, по-видимому, способны генерировать код для этого, но я надеялся, что может быть способ, не требующий дополнительной ручной работы, кроме нажатия на Build. Если нет, то мне все-таки придется исследовать эти инструменты дальше.

Кстати, с использованием Visual Studio 2010.

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

C и C ++ не имеют отражения. Поэтому любой инструмент, который вы используете, потребует хотя бы некоторой ручной работы. Вам нужно будет ввести что-то для каждой функции, которую вы хотите экспортировать, или вам придется поместить прототипы в специальное место или что-то в этом роде.

Доступен список утилит привязки Lua . Некоторые из них полуавтоматизированы, включая парсеры, которые могут читать некоторые подмножества C ++ и полуавтоматически генерировать для них код привязки. SWIG, toLua и toLua ++ являются одними из них. Другие требуют больше работы, но немного упрощают явное объявление поведения (например, права собственности и т. Д.).

1 голос
/ 22 августа 2011

Синтаксис, который вы хотите написать, похож на тот, который вы напишите, если будете использовать Luabind для экспорта своих функций C ++ в Lua.

Я использовал для непосредственного использования API Lua Cинтегрировать Lua с C ++, но, так как я обнаружил Luabind, я никогда не буду этого делать.

При инициализации вашей программы у вас может быть что-то вроде этого.

#include <lua.hpp>
#include <luabind/luabind.hpp>

lua_State * L = luaL_newstate();
luaL_openlibs(L);
luabind::open(L);
luabind::module(L) [
    luabind::def("settilemarker", &SetTileMarker)
];

Если SetTileMarker не является бесплатнымфункция, но метод класса Foo, тогда вы бы сделали это вместо этого.

luabind::module(L) [
    luabind::class_<Foo>("foo")
        .def("settilemarker", &Foo::SetTileMarker)
];

Это не так изящно, как возможность распределить вашу регистрацию повсеместно, но я считаю, что это проще и более синтаксически доступночем напрямую использовать Lua C API.

0 голосов
/ 22 августа 2011

Вы смотрели на SWIG Я использовал его, и хотя он немного сложен, он автоматизирует многие вещи для вас.

...