Посоны, что-то я упоролся по хардкору и стал писать паттерн матчинг для С++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()
и т.д. Заранее спасибо.