ошибка при обобщении моей функции шаблона variadic - PullRequest
3 голосов
/ 27 марта 2019

Я реализовал шаблонную функцию ниже, используя 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

Есть ли какое-нибудь исправление в этом или лучший способ сделать мою функцию более общей?

...