我希望下面有这样的内容:
template <class T>
struct Container{
public:
//[] operator
private:
T containment;
};
包容应该是一个具有任何选择性维数的数组,如下所示:
Container<int[20][4]> obj;
Container<int[5][2][6]> obj1;
//etc...
我想实现[]运算符,以便可以进行以下分配:
obj[2][3]=6;
obj1[1][1][3]=3;
//etc...
但经过几次尝试后我发现自己陷入了困境,这怎么可能?
答案 0 :(得分:5)
您的订阅运营商应返回一个代理对象,该对象本身将实现订阅运营商。
如果我们将调用分解为obj[2][3] = 6
,则会产生:
obj[2]
- &gt;代理对象obj[2][6]
- &gt;参考int
通过查看obj1
,您会发现除了最后一个[]
之外的所有人都应该返回代理对象。
这通常是通过使用带有“深度”参数的模板化代理来实现的,并将其专门化为适当的深度。在您的情况下,您的代理将有一个指针T
指向它可能产生的第一个元素,以及维度列表(作为模板参数)。
虽然这并不简单,因为你希望看起来有任意数量的参数。根据您的目标编译器是否支持可变参数模板,您可能会感到非常悲痛。
答案 1 :(得分:3)
你可以这样做(尽管每个维度的新模板)。
template <class T, size_t m, size_t n>
struct Container{
public:
int& operator()(size_t i, size_t j)
{
return containment[i][j];
}
private:
T containment[m][n];
};
Container<int, 3, 4> ints;
ints(0,3) = 5;
或者你可以使用Boost.MultiArray,并节省很多痛苦。
Boost MultiArray库增强了 用C ++标准容器 多功能多维阵列 抽象。它包括一般 数组类模板和本机数组 支持惯用数组的适配器 操作并与C ++互操作 标准库容器和 算法。阵列共享一个共同点 接口,表示为通用 编程就哪种通用而言 阵列算法可以实现。
答案 2 :(得分:2)
难点在于知道operator[]
的返回类型。你可以尝试这样的事情:
template <class T, size_t N>
struct Container {
T containment[N];
T &operator[](size_t index) { return containment[index]; }
};
Container<int[2][6], 5> obj;
或者,您可以根据自身定义Container:
Container<Container<Container<int[6]>[2]>[5]> obj;
答案 3 :(得分:1)
谁想到参考会在这里发挥作用?我!
感谢Niki Yoshiuchi,我想要的确切框架中的答案如下:
template <class T, size_t N>
struct Container {
private:
T containment[N];
public:
T & operator[](size_t index) { return containment[index]; }
};
Container<int[3][3][3],2> obj;
obj[1][1][1][1]=7;
答案 4 :(得分:0)
制作n维收藏的基础知识就是这样的。它假定容器不能重新定尺寸。
template< typename T >
class MultiDimContainer
{
std::vector<size_t> dims;
std::vector<T> data;
public:
MultiDimContainer( const std::vector<size_t> dims )
{
// work out the product of dims and set data to that size
}
T& at( const std::vector<size_t> & dim )
{
// calculate where it lives in memory and return that element
}
};
由于我在()处实现了一个参数,你可以使用operator []来实现。您可能需要2个重载,一个const和一个非const,而at()将绑定检查,而operator []则不会。您可能需要一个辅助(非模板)函数来计算数据向量中此元素的位置。
当然,构造向量是一个多步骤的过程,所以你可以使用一些魔术类来构造一个。
您的容器的operator []也可以使用单个size_t并返回ContainerReferencer对象。这不是一个真正的多维数组,而是对其他地方保存的数据的切片。再一次可能有const或非const版本。
使用此模型无法多次调用operator []过滤到T value_type或对其的引用。
可以使用可以作为模板参数的硬尺寸数组。所以,如果你知道它是4维,你可以称之为
MultiDimCollection&LT; double,4&gt;
它总是有4个维度。然后,您可以获取operator []以返回MultiDimCollectionReference&lt; double,3&gt;
这将下降到2和1(向量)然后专门返回标量。