Как можно наиболее красиво проверить значение на вхождение в список указанный как список инициализации?
Что бы удобно было выполнять подобные или другие условные конструкции?
void my_func(uint a, MyEnum b) {
assert( a belong {0,1,2,3} && b belong {MyEnum::def1,MyEnum::def2} );
}
==========================================================
По результатам обсуждений пришел к выводу, что оптимальным будет следующий вариант:
template <typename T, typename... Args>
bool belong(const T &t, const Args &... args) {
return ((t == args) || ...);
}
...
if (belong(a, MyEnum::v1, MyEnum::v2, MyEnum::v3))
do_something();
Возможен вариант без дополнительных функций:
if (std::set({MyEnum::v1,MyEnum::v2}).count(b))
do_something();
И еще вариант со списком инициализации, с более наглядным использованием, но возможно чуть медленный чем первый:
template <class T>
bool belong(const T &v, const std::initializer_list<T> &list) {
auto itr = std::find(list.begin(), list.end(), v);
return itr != list.end();
}
...
if (belong(a, {MyEnum::v1,MyEnum::v2}))
do_something();