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

218
02 апреля 2017, 04:55

Заинтересовался либой LuaBind. Читаю доку, разбираю примеры. И тут попался странный хлоуворлд:

#include <iostream>
#include <luabind/luabind.hpp>
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;
}

Код вроде бы С++, но то, что я выделил комментами ... не пойму. Что это? Собственно в этом вопрос.

Answer 1

А если бы это выражение было записано так

module(L)[def("greet", &greet)]; 

оно стало бы понятнее?

А если так

m[x]

то есть, выше это просто обращение к элементу некого массива, который возвращает функция module(...). А индекс вычисляется функцией def(...,...).

Но module() может возвращать объект, у которого определен оператор operator[...]. В таком случае это все будет просто два вызова. И схематически можно описать так (предупреждаю - схематически!)

auto tmp = module(L);
tmp.operator[](def("greet", &greet));
Answer 2

Ну вот, например, набор определений на самом что ни на есть базовом языке С (!), который позволит вам написать ту же самую конструкцию

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 будет, конечно, более богатой из-за использования перегруженных операторов, но использованный тут синтаксис - банален.

Answer 3

luabind::module это функция, возвращающая класс luabind::module_. У него переопределен оператор [], получающий тип luabind::scope в качестве аргумента. luabind::class_::def, luabind::def возвращают luabind::class_& , который является потомком luabind::scope и преобразуется к нему. В остальном, это всего лишь использование перегруженного оператора[] для передачи класса-функтора классу-исполнителю (модулю).

READ ALSO
как закрыть окно браузера по его названию и запустить ярлык

как закрыть окно браузера по его названию и запустить ярлык

как закрыть окно браузера по его названию, а потом (если закрытие было) открыть ссылку/ярлык/батник?

195
Переключение между окнами в Qt версии 4.8

Переключение между окнами в Qt версии 4.8

В общем сделал как в примере на сайте https://evilegcom/ru/post/112/

254
Ошибка памяти Android NDK

Ошибка памяти Android NDK

При использовании функции strcat() появляется ошибка (в любой момент, если вызвать функцию не один раз):

233