C++17:integer_sequence 编译错误的用法
C++17: integer_sequence usage with compilation error
我想用一个integer_sequence来判断一个范围内的数字是否都在某个值以下:is_range() will return true, else return错误,如下所示:
#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;
最后,如果您希望能够将 braced-init-list 传递给 in_range
,您应该接受 initializer_list<size_t>
。否则,模板参数推导将失败,因为 braced-init-list 不是表达式,因此它没有类型。
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;
我想用一个integer_sequence来判断一个范围内的数字是否都在某个值以下:is_range() will return true, else return错误,如下所示:
#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;
最后,如果您希望能够将 braced-init-list 传递给 in_range
,您应该接受 initializer_list<size_t>
。否则,模板参数推导将失败,因为 braced-init-list 不是表达式,因此它没有类型。
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;