Я попытался создать функцию, которая проверяет, соответствует ли аргумент определенным значениям.
Я думаю, знаю, как это сделать с помощью рекурсии или std::initializer_list, но я хочу сделать это с помощью сгиба. Вот нерабочий код:
template<typename T, T ...ts>
constexpr bool is_in(T value){
return (ts == value) || ... || (false);
}
int main(){
if constexpr(is_in<int, 1, 2, 3>(1))
return 10;
}
Также я хотел бы избавиться от указания типа, если это возможно (например, <int>)
Хотите решение на C++17, но было бы интересно увидеть и C++20.
код совершенно неправильный. Я просто показываю то, что хочу сделать. не надо ошибок.
Просто поставьте еще один кронштейн и все начнет работать как в return ((ts == value) || ... || (false)).
Смотрите демо
Спасибо работает. есть идеи, как мне избавиться от Т?
Дополнительный тип параметра шаблона можно избежать, template<auto ... Ts> constexpr bool is_in(std::common_type_t<decltype(Ts)...> value){...}





Вам просто нужно заключить все выражение в круглые скобки, как показано ниже:
template<typename T, T ...ts>
constexpr bool is_in(T value){
//---------v-------------------------------v--->added parnthesis
return ((ts == value) || ... || (false));
}
есть идеи, как мне избавиться от Т
Да, вы также можете использовать тип заполнителя auto, чтобы он работал без явного указания int, заменив <typename T, T ...ts> на <auto ...ts, typename T>
Выражения сгиба должны быть заключены в (...): return ((ts == value) || ... || (false));.
Также можно отбросить || false, это неявно для || складок.
Также я хотел бы избавиться от указания типа, если это возможно (например,
<int>)
Вы можете сделать это, заменив <typename T, T ...ts>, например, на. <auto ...ts, typename T>.
Но на вашем месте я бы передал все альтернативы в качестве параметров функции (чтобы их можно было изменять во время выполнения).
передача параметров в командной строке также делает функцию более понятной. опубликую ответ
По предложению @HolyBlackCat вот версия с параметрами самой функции.
Выглядит очень понятно, и избавьтесь от указания <T>.
template<typename T, T ...ts>
constexpr bool is_in1(T value){
static_assert(sizeof...(ts) > 0);
return ((ts == value) || ...);
}
template<typename T, typename ...Ts>
constexpr bool is_in2(T value, Ts... ts){
static_assert(sizeof...(ts) > 0);
return ((ts == value) || ...);
}
int main(){
if constexpr(is_in1<int, 3,4,5,1>(1)){
// return 20;
}
if constexpr(is_in2(1, 3,4,5,1))
return 10;
}
Всегда публикуйте полную ошибку вместе с вашим вопросом.