Closed apolukhin closed 3 years ago
Antervis, 20 марта 2019, 12:59 в языке есть fold expressions, для вариадик пака можно сделать if (((a == args) && ...)).
Лягуха Пепе, 20 марта 2019, 15:40 Antervis,
Antervis, я хочу в подобные мини-хелперы засовывать не вариадик-пак. а нормальные переменные. А вон внутри, да, вариадик пак и фолд экспрешшены, по идее
Andrey Davydov, 21 марта 2019, 10:28
А так не подойдет?
ranges::any_of({1, 2, 3}, a)
Лягуха Пепе, 22 марта 2019, 22:18 Andrey Davydov, мне кажется, что это будет не zero_cost
Andrey Davydov, 22 марта 2019, 23:20 Лягуха Пепе, JordanRudess, для этих 2-х функций
namespace v1 {
template<typename T, typename... Ts>
bool any_of(T t, Ts... ts) {
return ((t == ts) || ...);
}
bool test(int a, int b, int c, int d) {
return any_of(a, b, c, d);
}
}
namespace v2 {
template<typename T>
bool any_of(T x, std::initializer_list<T> ys) {
for (T y : ys) {
if (x == y)
return true;
}
return false;
}
bool test(int a, int b, int c, int d) {
return any_of(a, { b, c, d });
}
}
clang выдает дословно совпадающий assembler: https://gcc.godbolt.org/z/JVo6Nr
Лягуха Пепе, 29 марта 2019, 22:12 Andrey Davydov, ну, де-факто это закрывает мой юзкейс, но, хочется чего-то... почище? :) Правда, я не уверен, что "почище" это достаточная мотивация для комитета.
С компилятором поновее и с std::array код оптимизируется до одинакового состояния https://gcc.godbolt.org/z/rWvKjr5E8
std::ranges получается так же производительно: https://gcc.godbolt.org/z/8ba6vro5r
Кодга добавят std::ranges::contians , то будет ещё и коротко :)
Перенос предложения: голоса +??, -?? Автор идеи: ??
Часто приходится писать код, типа
if ((a == 1) || (a == 2) || (a == 3)) { ... };
Мне кажется, что что-то типа if (std::any_of_variadic(a, 1, 2, 3)) { ... }; этот код бы достаточно сократило.
+Для консистентности, можно было бы добавить all_of_variadic и none_of_variadic.
Существует еще вариант, который очень близок к стандартной библиотеке, такой как std::something_of_variadic(функтор, аргументы...), может есть смысл подумать над ним?