C++17: использование integer_sequence с ошибкой компиляции

Я хочу использовать integer_sequence, чтобы судить, находится ли диапазон чисел под определенным значением: is_range() вернет true, иначе вернет false, как показано ниже:

#include<utility> 
#include<iostream> 
using namespace std; 
template <std::size_t N, std::size_t... Ix> 
bool in_range(std::index_sequence<Ix...>) { 
   return ((Ix < N) && ...); 
} 
int main() 
{ 
     cout<<in_range<10>({1,2,30})<<endl; 
     cout<<in_range<10>(1,2,3)<<endl; 
     return 0; 
} 

Я использовал clang3.8 для компиляции, но не получилось.

$ clang++ m.cpp -std=c++1z 
m.cpp:5:37: error: template argument for template type parameter must be a type 
bool in_range(std::integer_sequence<Ix...>) { 
                                     ^~~~~ 
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.3.1/../../../../include/c++/5.3.1/utility:229:21: note: 
       template parameter is declared here 
   template<typename _Tp, _Tp... _Idx> 
                     ^ 
m.cpp:10:11: error: no matching function for call to 'in_range' 
     cout<<in_range<10>({1,2,30})<<endl; 
           ^~~~~~~~~~~~ 
m.cpp:11:11: error: no matching function for call to 'in_range' 
     cout<<in_range<10>(1,2,3)<<endl; 
           ^~~~~~~~~~~~ 
3 errors generated.

Как мне исправить мой код? Я полагаю, что мое понимание выражения сгиба неверно

Как это исправить?

1 ответ

Там нет необходимости для index_sequence здесь вы можете просто передать список чисел для сравнения в качестве аргументов шаблона.

template <std::size_t N, std::size_t... Ix> 
bool in_range() { 
   return ((Ix < N) && ...); 
}
cout<<in_range<10,1,2,30>()<<endl;

Или если вы хотите передать их в качестве аргументов в шаблон функции

template <std::size_t N, typename... Ix> 
bool in_range(Ix... ix) { 
   return ((ix < N) && ...); 
}
cout<<in_range<10>(1U,2U,30U)<<endl; 

Наконец, если вы хотите иметь возможность передать список фигурных скобок в in_range Вы должны принять initializer_list<size_t>, В противном случае вывод аргумента шаблона завершится неудачно, потому что список фигурных скобок не является выражением и поэтому не имеет типа.

template <std::size_t N> 
constexpr bool in_range(std::initializer_list<std::size_t> ix) { 
    for(auto i : ix) {
        if(i >= N) return false;
    }
    return true;
}
cout<<in_range<10>({1,2,30})<<endl; 

Живая демо

Другие вопросы по тегам