【发布时间】:2019-01-04 21:39:53
【问题描述】:
我有一个等级为 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。什么是反转构造函数和索引函数的参数顺序的简单方法?
编辑: 我尝试使用建议的反转可变参数的方法来实现,但这不是最理想的,因为它需要反转索引和构造函数的参数,并且这两种情况下必要的辅助函数看起来会略有不同。初始化列表的答案看起来更直接。
【问题讨论】: