Я реализовал шаблонную функцию ниже, используя variadic, но у меня возникают трудности с тем, чтобы сделать его более универсальным. Я использую MS VS C ++ 2017.
Эта функция по существу проверяет, является ли целочисленное значение одним из значений, предоставленных аргументом int templates. Теоретически должен быть эквивалентен списку логических ИЛИ.
template<int TFirst, int...TArgs>
constexpr bool foo(int&& a)
{
if constexpr (sizeof...(TArgs) > 0)
return a == TFirst || foo<TArgs...>(std::forward<int>(a));
return a == TFirst;
}
int iii = 3;
assert(foo<1, 2, 3>(std::forward<int>(iii)); // ok!
Я хотел бы сделать эту функцию еще более универсальной, используя другие числовые типы, такие как двойные или классовые перечисления или даже объекты.
Я попробовал код ниже. Он строится с целыми числами, но НЕ с двойными.
template<typename T>
struct check
{
template<T TFirst, T...TArgs>
static constexpr bool foo(T&& a)
{
if constexpr (sizeof...(TArgs) > 0)
return a == TFirst || foo<TArgs...>(std::forward<T>(a));
return a == TFirst;
}
};
// test
int iii = 3;
double ddd = 4.0;
check<int>::foo<1, 2, 3>(std::forward<int>(iii)); // ok
check<double>::foo<1.0, 2.0, 3.0>(std::forward < double >(ddd )); // non ok
Ошибка с двойной является
error C2993: 'T': illegal type for non-type template parameter 'TFirst'
error C2672: 'check<double>::foo': no matching overloaded function found
Есть ли какое-нибудь исправление в этом или лучший способ сделать мою функцию более общей?