Я хочу использовать 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.
Как мне исправить мой код? Я полагаю, что мое понимание выражения сгиба неверно
Как это исправить?
Там нет необходимости для 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;
Наконец, если вы хотите, чтобы иметь возможность пройти приготовился-INIT-лист в in_range
Вы должны принять initializer_list<size_t>
, В противном случае вывод аргумента шаблона завершится неудачно, потому что приготовился-INIT-лист не является выражением, и поэтому он не имеет типа.
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;
Других решений пока нет …