Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Странный синтаксис С++ кода в библиотеке LuaBind

#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 и преобразуется к нему. В остальном, это всего лишь использование перегруженного оператора[] для передачи класса-функтора классу-исполнителю (модулю).

Комментариев нет:

Отправить комментарий