ошибка при обобщении моей функции шаблона переменных

#c #variadic-templates #variadic-functions

#c #переменные-шаблоны #переменные функции

Вопрос:

Я реализовал приведенную ниже функцию шаблона, используя variadic, но у меня возникли трудности с тем, чтобы сделать ее более универсальной. Я использую MS VS C 2017.

По сути, эта функция проверяет, является ли целочисленное значение одним из значений, предоставленных в аргументе шаблонов int. Теоретически должно быть эквивалентно списку логических ИЛИ.

 template<int TFirst, int...TArgs>
constexpr bool foo(intamp;amp; 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!
  

Я хотел бы сделать эту функцию еще более универсальной, используя другие числовые типы, такие как перечисления double или class, или даже объекты.

Я попробовал приведенный ниже код. Он строится с целыми числами, но НЕ с удвоениями.

  template<typename T>
 struct check
 {
     template<T TFirst, T...TArgs>
     static constexpr bool foo(Tamp;amp; 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
  

Ошибка, с которой я сталкиваюсь с double, является

  error C2993: 'T': illegal type for non-type template parameter 'TFirst'
 error C2672: 'check<double>::foo': no matching overloaded function found
  

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

Комментарии:

1. Вы не можете использовать двойные значения в качестве параметров шаблона, смотрите Связанный вопрос для получения справочной информации. Обойти это невозможно, вам придется придумать какой-нибудь альтернативный подход, который не предполагает двойных параметров шаблона.

2. @SamVarshavchik Можем ли мы не закрывать это как обман, а вместо этого признать, что они не могут делать то, что у них есть, из-за обмана, так как они могут обойти это.

3. Я see..so это все равно, что использовать строку литералов для шаблона .. интересно. Я вообще не думал об этом. Спасибо, что указали мне на правильный ответ; Я поискал в Google похожие вопросы, но не смог найти ничего подобного.

4. @AbruzzoForteeGentile FWIW, вы могли бы написать код, подобный этому

5. @Nathan. Вау! Это довольно жестко! Я никогда не видел, чтобы так использовали «…»? На самом деле я не очень понимаю, как работает ваша функция (извините). Я привык рекурсивно вызывать вариационный шаблон с меньшим аргументом… Я понятия не имею, как расширяется ваша функция. Можете ли вы указать мне на какой-нибудь полезный совет для дальнейшего чтения или исследования? Я нашел это использование поистине удивительным.