Заинтересовался либой 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;
}
Код вроде бы С++, но то, что я выделил комментами ... не пойму. Что это? Собственно в этом вопрос.
А если бы это выражение было записано так
module(L)[def("greet", &greet)];
оно стало бы понятнее?
А если так
m[x]
то есть, выше это просто обращение к элементу некого массива, который возвращает функция module(...)
. А индекс вычисляется функцией def(...,...)
.
Но module()
может возвращать объект, у которого определен оператор operator[...]
. В таком случае это все будет просто два вызова. И схематически можно описать так (предупреждаю - схематически!)
auto tmp = module(L);
tmp.operator[](def("greet", &greet));
Ну вот, например, набор определений на самом что ни на есть базовом языке С (!), который позволит вам написать ту же самую конструкцию
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 будет, конечно, более богатой из-за использования перегруженных операторов, но использованный тут синтаксис - банален.
luabind::module это функция, возвращающая класс luabind::module_. У него переопределен оператор [], получающий тип luabind::scope в качестве аргумента. luabind::class_::def, luabind::def возвращают luabind::class_& , который является потомком luabind::scope и преобразуется к нему. В остальном, это всего лишь использование перегруженного оператора[] для передачи класса-функтора классу-исполнителю (модулю).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
как закрыть окно браузера по его названию, а потом (если закрытие было) открыть ссылку/ярлык/батник?
В общем сделал как в примере на сайте https://evilegcom/ru/post/112/
При использовании функции strcat() появляется ошибка (в любой момент, если вызвать функцию не один раз):