如何为此结构实现[]运算符?

时间:2010-11-22 17:05:30

标签: c++ arrays data-structures operators

我希望下面有这样的内容:

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...

但经过几次尝试后我发现自己陷入了困境,这怎么可能?

5 个答案:

答案 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(向量)然后专门返回标量。

相关问题