LINUX.ORG.RU

Pattern matching для С++20

 


0

3

Посоны, что-то я упоролся по хардкору и стал писать паттерн матчинг для С++20. Пример:

variant<int, string> v = 1+2+3+5+7+11;
const auto pattern = pm::any_of(29, "42");

cout << *match(v,
  // match with pattern although pass (fall through). also create side effect in the middle of matching
  pass(pattern,            [&v] { cout << "How does this work?\n"; v = "42"; })
| pass(pattern,            [&v] { v = R"(I wonder ¯\_(ツ)_/¯)"; }) // match with pattern again, also pass
| with(pm::type(string{}), [&v] { return get<string>(v); }) // match with stored type
| with(__,                 []   { return R"(('・ω・'))"s; })) // catch-all condition (default)
<< endl;

Потом я начал писать концепции и понял, что я ещё даже не начинал упарываться. Но вроде что-то получается и довольно просто реализуется, что меня и смущает. Может я чего-то не понимаю или упустил что-то важное и сделал где-то ошибку которую я не вижу.

Я так почитал пропозал для паттерн матчинга, вроде много чего из фичей есть кроме некоторых вещей, хотя я не до конца понимаю всё, что там написано и зачем оно там.

Я это отложу пока что потому мне это надо осмыслить, но может кто-то из многоуважаемых регистрантов или не менее многоуважаемых анонимусов посмотрит пока на это барахло и что-то посоветует? В код может кто-то глянет, всё ли по феншую? Там не много, меньше 700 строк кода пока что и очень простой дизайн.

Ссылка: https://bitbucket.org/alekseyt/pm

Более полный пример использования: https://bitbucket.org/alekseyt/pm/src/master/examples/example.cpp

И там в тестах всякие guard(), within(), maybe() и т.д. Заранее спасибо.

Очередная финальная версия на сегодняшний день. Завезли композицию паттернов, (наверное) идеальный форвардинг. Насколько я могу судить, вся часть пропозала для которой есть примеры, функционально реализуется на pm, но может я что-то упускаю.

struct S {
  int x = 42;
  string s;
} const s;

match(tie(s.x, s.s)
  | with(make_tuple(42, __) + decons(),
    [] (int x, const string &y) { return to_string(x) + y; }));

Ну вот что-то такое получается. Добавление + decons() перед колбэком само разберёт результат матчинга на компоненты. Ещё появились экстракторы и можно делать всякие прикольные штуки, типа если ссылка пробрасывается в колбэк без изменений, то в колбэке можно изменить значение того что сейчас матчится. По-моему вполне в духе С++, но можно это и отключить если есть такое желание.

Остальное описано в кукбуке.

aleksey_tulinov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.