перевожу на С++ код с раста
там есть прикольный макрос matches
накидал по быстрому более менее похожее
из TODO это добавить std::ignore для пропуска аргументов
может кто улучит или дополнит
еще по правильному бы сделать static_assert в matches до вызова _impl на размер массива и количество аргументов
я начал было делать и он работает
но для этого нужно было делать больше перегрузок для span и обычного массива
иначе размерность не достать
а делать на одном span, нельзя в чистую захватить обычный массив
вообщем оставил с обычной ссылкой, котрая матчит и то и другое
по мере разгребания конюшен раста, может что то усовершенствую
а расте он конечно более мощнее и навороченее, полностю врядли можно повторить на плюсах такое
Здравствуйте, reversecode, Вы писали:
R>перевожу на С++ код с раста R>там есть прикольный макрос matches R>накидал по быстрому более менее похожее R>из TODO это добавить std::ignore для пропуска аргументов R>может кто улучит или дополнит
"Program terminated with signal: SIGSEGV" не смущает?
я сначала думал как лямбду поматчить
потом пробежался по треитах
и решил не ломать мозг и взять инверсию
инвокейбл был открыт третей закладой из всех треитов которые хотел попробовать
так что я до него не дошел что бы проверить
нужно весь переводимый с раста функционал завести было
Здравствуйте, reversecode, Вы писали:
_>>"Program terminated with signal: SIGSEGV" не смущает?
R>нет ;) R>это последний ассерт, показать что оно работает R>не.. можно конечно было сравнить с false
При чём тут сравнение? У тебя происходит падение из-за проезда по памяти ещё до проверки результата assert'ом — https://godbolt.org/z/1rv7jKGcr
R> можно конечно было сравнить с false R> но так не интересно
Если это тест, то пиши в проверяемом условии то, что должно выполняться — и другим было бы понятнее, и тебе бы писали больше по делу, а не про глупые ошибки или про стиль.
Иногда, конечно, в системах тестирования нужно уметь сказать, что тест сейчас падает и для этого используется статус xfail, но assert такие нюансы не умеет выражать.
R> может кто улучит или дополнит
Кстати, о стиле: криво расставлены forward и ссылки.
Выглядит забавно, что сначала у аргументов старательно сохраняются типы при рекурсивных вызовах, но только чтобы в функции cmp их проигнорировать в строках
Впрочем, обычно это только производительность ухудшает.
Но вот выше в условии if constexpr (!std::is_integral<Arg>::value) эта проблема с неправильными ссылочными типами может влиять куда сильнее. Из-за неё вызовы заходят в разные ветки и начинаются проблемы:
int b[1]={23};
const int j = 23;
assert(matches(std::span(b), 23)); // компилируется
assert(matches(std::span(b), j)); // не компилируется
assert(matches(std::span(b), std::move(j))); // снова компилируется
R>но для этого нужно было делать больше перегрузок для span и обычного массива R>иначе размерность не достать R>а делать на одном span, нельзя в чистую захватить обычный массив
Наконец, можно в терминах кортежей. (Лень сшивать-расшивать кортежи в вариадики, сами пишите кому не жалко)
Для итераторов произвольного доступа (и, в принципе, даже для однонаправленных) ещё можно делать предварительную проверку на длину образца: это даст небольшой плюс к производительности.
Он применяется, когда нужен простейший паттерн-матчинг (для проверки, что вообще сматчится шаблон или нет). Для того же самого можно использовать полноценный оператор matсh или if let, но придётся написать немного больше кода.
Лично я использую этот макрос очень редко. И мне не нравится как выглядит условие с этим макросом:
if matches!(some_var, SomePattern::A(_)) {
// do something
}
Не нравится потому что глаз цепляется за знак ! и когда смотришь код невнимательно, иногда начинает казаться, что в условии стоит отрицание
Но это тут уже оффтопик )
классная ссылка на репу по плюсам матчес
я тоже подумывал про матч тоже, почитывая и поглядывая на попрозл
но выбрал приоритетнее то что делаю
чем тратить время на изобритение которое оказывается существует
к слову
паттен матчинг в плюсах раньше С++29 можно не ждать
на реддите выкатили консерватив/оптимистик тайм