#cpp
Заинтересовался либой LuaBind. Читаю доку, разбираю примеры. И тут попался странный хлоуворлд: #include#include void greet() { std::cout << "hello world!\n"; } extern "C" int init(lua_State* L) { using namespace luabind; open(L); module(L) // Что это за конструкция такая? [ // def("greet", &greet) // ]; // return 0; } Код вроде бы С++, но то, что я выделил комментами ... не пойму. Что это? Собственно в этом вопрос.
Ответы
Ответ 1
Ну вот, например, набор определений на самом что ни на есть базовом языке С (!), который позволит вам написать ту же самую конструкцию const int L = 42; void greet(void) {} int *module(int i) { static int a[1] = { 0 }; return a; } int def(const char *c, void f(void)) { return 0; } int main() { module(L) [ def("greet", &greet) ]; } Что говорит о том, что данная конструкция использует самый базовый синтаксис языка и ничего необычного в ней нет. Семантика этой конструкции в Lua будет, конечно, более богатой из-за использования перегруженных операторов, но использованный тут синтаксис - банален.Ответ 2
А если бы это выражение было записано так module(L)[def("greet", &greet)]; оно стало бы понятнее? А если так m[x] то есть, выше это просто обращение к элементу некого массива, который возвращает функция module(...). А индекс вычисляется функцией def(...,...). Но module() может возвращать объект, у которого определен оператор operator[...]. В таком случае это все будет просто два вызова. И схематически можно описать так (предупреждаю - схематически!) auto tmp = module(L); tmp.operator[](def("greet", &greet));Ответ 3
luabind::module это функция, возвращающая класс luabind::module_. У него переопределен оператор [], получающий тип luabind::scope в качестве аргумента. luabind::class_::def, luabind::def возвращают luabind::class_& , который является потомком luabind::scope и преобразуется к нему. В остальном, это всего лишь использование перегруженного оператора[] для передачи класса-функтора классу-исполнителю (модулю).
Комментариев нет:
Отправить комментарий