我有一个N阶的张量类,它将存储在数组中的数据包装起来。例如,秩3张量将具有维数(d0、d1、d2),并且将使用来自长度d0×d1×d2的底层数组的多索引(i0、i1、i2)访问唯一元素。如果d0=d1=d2=10,i0=1,i1=2,i2=3,那么将访问数组的元素123。
我实现了一个递归定义的类,它从多个索引中计算单个数组索引,如下所示:
template<size_t N>
class TensorIndex : TensorIndex<N-1> {
private:
size_t d;
public:
template<typename...Ds>
TensorIndex( size_t d0, Ds...ds ) : TensorIndex<N-1>( ds... ), d(d0) {}
template<typename...Is>
size_t index( size_t i0, Is...is ) {
return i0+d*TensorIndex<N-1>::index(is...);
}
};
template<>
struct TensorIndex<1> {
TensorIndex( size_t ) {}
size_t index( size_t i ) { return i; }
};
它颠倒了所需的顺序。
TensorIndex<3> g(10,10,10);
std::cout << g.index(1,2,3) << std::endl;
输出321。什么是反转构造函数和索引函数的参数顺序的简单方法?
编辑:
我尝试使用建议的方法反转变量参数来实现,但这是次优的,因为它需要同时反转索引和构造函数的参数,这两种情况下所需的帮助函数看起来略有不同。初始值设定项列表的答案看起来更简单。