C++ 如何迭代std::index_序列
我的源代码中有以下代码:C++ 如何迭代std::index_序列,c++,c++11,c++14,variadic-functions,index-sequence,C++,C++11,C++14,Variadic Functions,Index Sequence,我的源代码中有以下代码: template <std::size_t... Dims> class DimensionPack { public: using Dimensions = std::index_sequence<Dims...>; static const std::size_t total_dimensions = sizeof...(Dims); std::vector<unsigned int> even_or_o
template <std::size_t... Dims>
class DimensionPack {
public:
using Dimensions = std::index_sequence<Dims...>;
static const std::size_t total_dimensions = sizeof...(Dims);
std::vector<unsigned int> even_or_odd;
public:
DimensionPack() {
unsigned idx = 0;
for ( ; idx < total_dimensions; idx++ ) {
//MatrixDimensionOddOrEven mdoe( Dimensions[idx] );
//unsigned int val = mdoe.even_or_odd;
//even_or_odd.push_back( val );
}
}
};
这个头文件的cpp文件会编译,但是当我编译另一个cpp文件时,比如包含它的main文件;它无法编译
这是我收到的当前错误消息:
1>------ Build started: Project: FileTester, Configuration: Debug Win32 ------
1> main.cpp
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(44): error C2540: non-constant expression as array bound
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(41): note: while compiling class template member function 'DimensionPack<2,3,4>::DimensionPack(void)'
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\main.cpp(336): note: see reference to function template instantiation 'DimensionPack<2,3,4>::DimensionPack(void)' being compiled
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(60): note: see reference to class template instantiation 'DimensionPack<2,3,4>' being compiled
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\main.cpp(155): note: see reference to class template instantiation 'Matrix<float,2,3,4>' being compiled
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(45): error C2228: left of '.even_or_odd' must have class/struct/union
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(45): error C2789: 'val': an object of const-qualified type must be initialized
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(45): note: see declaration of 'val'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
1>----构建已启动:项目:FileTester,配置:调试Win32------
1> main.cpp
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(44):错误C2540:数组绑定的非常量表达式
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(41):注意:编译类模板成员函数“DimensionPack::DimensionPack(void)”时
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\main.cpp(336):注意:请参阅正在编译的函数模板实例化“DimensionPack::DimensionPack(void)”的参考
1> c:\users\skilz80\documents\visualstudio 2015\projects\filetester\filetester\matrix.h(60):注意:请参阅正在编译的类模板实例化“DimensionPack”的参考
1> c:\users\skilz80\documents\visualstudio 2015\projects\filetester\filetester\main.cpp(155):注意:请参阅正在编译的类模板实例化“矩阵”的参考
1> c:\users\skilz80\documents\visualstudio 2015\projects\filetester\filetester\matrix.h(45):错误C2228:“.偶数”或“奇数”的左边必须有class/struct/union
1> c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(45):错误C2789:“val”:必须初始化常量限定类型的对象
1> c:\users\skilz80\documents\visualstudio 2015\projects\filetester\filetester\matrix.h(45):注意:请参见“val”的声明
======生成:0成功,1失败,0最新,0跳过==========
给我带来麻烦的并不是编译器错误;在使用可变模板和参数包时,我对这种语法有点陌生。那么,我如何正确地编写语法来获取这个
std::index_序列的各个元素,这些元素通过using
指令分配给Dimensions
,以便将这些值传递给DimensionPack类中for循环中看到的helper结构的构造函数呢?没有必要对于索引\u序列
。这将有助于:
template <std::size_t... Dims>
class DimensionPack {
public:
std::vector<unsigned int> even_or_odd;
public:
DimensionPack()
: even_or_odd{MatrixDimensionOddOrEven{Dims}.even_or_odd...}
{
}
};
模板
类维度包{
公众:
std::向量偶数或奇数;
公众:
DimensionPack()
:偶数或奇数{matrixdimensionoddoren{Dims}。偶数或奇数…}
{
}
};
作为奖励,它的美妙之处在于您不需要将每个元素向后推。您可以使用所有元素直接初始化向量。为什么要这样做
template <std::size_t... Dims>
class DimensionPack {
public:
using odd_dims = std::integer_sequence<bool,
std::enable_if_t<Dims!=0, bool>(Dims%2)...
>;
constexpr static std::array<bool, sizeof...(Dims)> get_odd_dims() {
return {{ (bool)(Dims%2)... }};
}
};
模板
类维度包{
公众:
使用奇数_dims=std::integer_序列;
constexpr static std::数组get_odd_dims(){
返回{(bool)(Dims%2)…};
}
};
现在,odd_dims
是一个整数序列
,其维度是偶数和奇数
get_odd_dims
返回维度为奇数的布尔数组。这比整数序列更容易迭代
如果任何dim
为0
,则odd_dim
类型将无法编译。不需要运行时检查
在这里,基于每个维度包的动态分配似乎是解决这个问题的一种非常奇怪的方法。index\u sequence
适用于您有数字并且需要序列的情况。您已经有了一个序列,所以就使用它吧。@Caleth其他人从另一个相关问题中提出了索引\u序列。然而,下面的答案对我很有用。谢谢你提供的信息!非常感谢。这要简单得多。我只是没想过用可变参数初始化一个向量。现在我可以开始着手我的类的实现并完成一些工作了!
template <std::size_t... Dims>
class DimensionPack {
public:
using odd_dims = std::integer_sequence<bool,
std::enable_if_t<Dims!=0, bool>(Dims%2)...
>;
constexpr static std::array<bool, sizeof...(Dims)> get_odd_dims() {
return {{ (bool)(Dims%2)... }};
}
};