Функции C++ Слэш оператор лямбда

на самом деле я не знаю, как быть очень точными.

сегодня я просмотрел следующую страницу:

http://siliconframework.org/docs/hello_world.html

Я нашел следующий синтаксис:

GET / _hello = [] () { return D(_message = "Hello world."); }

Я обнаружил, что " GET "может быть функцией по лямбда-выражению, но я не могу понять, что означает" / "и" _hello " здесь, и как они связаны с чем-то значимым.

кроме того, что это "_message = "?

кстати, мои основные знания C++ находятся до C++11.

Я немного погуглил.

может ли кто-нибудь любезно дать объяснение?

2 ответов


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

короче говоря, магия.

Первый БИТ магии заключается в:

iod_define_symbol(hello)

который является макросом, который генерирует идентификатор _hello типа _hello_t.

он также создает _hello_t тип, который inherites от помощника ЦРТП называется iod::symbol<_hello_t>.

_hello_t переопределяет различные операторы (включая operator= и operator/) таким образом, что они не делают то, что вы обычно ожидаете от объектов C++.

GET / _hello = [] () { return D(_message = "Hello world."); }

так это называет

operator=(
  operator/( GET, _hello ),
  /* lambda_goes_here */
);

аналогично в лямбде:

D(_message = "Hello world.");

is

D( operator=(_message, "Hello world.") );

operator/ и operator= можно сделать почти все.

на D случае = не назначив вместо ... , он строит структуру, которая в основном говорит: "поле под названием "message" присваивается значение "Hello world.".

_message знает, что это называется "message" потому что он был создан макрос iod_define_symbol(message) где они взяли строку message и сохранил его с типом _message_t, и создал переменную _message, который является экземпляром этого типа.

D принимает количество таких пар ключ/значение и связывает их вместе.

лямбда возвращает это пачка.

так [] () { return D(_message = "Hello world."); } - это лямбда, которая возвращает набор вложений пары ключ-значение, написанных странным образом.

затем мы вызываем operator= С GET/_hello С левой стороны.

GET еще один глобальный объект с operator/ перегружен. Я не нашел его. Предположим, он имеет тип iod::get_t (я придумал это имя: опять же, я не смотрел, какой это тип, и это действительно не имеет значения)

затем iod::get_t::operator/(iod::symbol<T> const&) is перегружен, чтобы создать еще один вспомогательный тип. Этот тип получает Tимя (в данном случае "hello"), и ждет, когда он будет назначен лямбда.

при назначении, он не делает то, что вы ожидаете. Вместо этого он отключается и создает ассоциацию между "hello" и вызывая эту лямбду, где ожидается, что эта лямбда вернет набор пар ключ-значение, генерируемых D.

затем мы передаем одну или несколько таких ассоциаций http_api, который собирает до этих пакетов и создает данные, необходимые для запуска веб-сервера с этими запросами и этими ответами, возможно, включая флаги с надписью "Я собираюсь быть http-сервером".

sl::mhd_json_serve затем получает данные, и номер порта, и фактически запускает веб-сервер.

все это куча слоев абстракции, чтобы сделать некоторое отражение проще. Созданные структуры имеют идентификаторы C++ и аналогичные строки. Подобные строки в них, и когда генерируется код сериализации (или десериализации) json, эти строки используются для чтения/записи значений json.

макросы просто существуют, чтобы сделать написание шаблона проще.

методы, которые могут быть полезны для чтения дальше, включают "шаблоны выражений", "отражение", "CRTP", встроенный "доменный язык", если вы хотите узнать о том, что здесь происходит.

некоторые из вышеперечисленных содержат незначительные "лжи, сказанные детям" -- в в частности, синтаксис оператора работает не совсем так, как я подразумевал. (a/b не эквивалентно operator/(a,b), в том, что второй не будет вызывать оператора-члена /. Понимая, что они функции это то, что я имею в виду, а не то, что синтаксис тот же.)

@mattheiuG (автор этой структуры) поделился эти слайды в комментарии ниже этого поста, который дополнительно объясняет D и _message маркеры и рамки.


это не стандартный синтаксис C++, это специфичная структура. Элементы с префиксом подчеркивания (_hello, _message etc) используются с генератором определений символов, который запускается и создает необходимые определения до компиляции.

в конце этой страницы есть дополнительная информация:http://siliconframework.org/docs/symbols.html. Qt делает аналогичную вещь с его .