【问题标题】:Arbitrary dimensional array using Variadic templates使用可变参数模板的任意维数组
【发布时间】:2015-05-10 19:13:40
【问题描述】:

如何在 C++11 中创建一个 Array 类,可以像这样使用

Array < int, 2, 3, 4> a, b; 
Array < char, 3, 4> d; 
Array < short, 2> e;

并以类似的方式访问它

a[2][1][2] = 15; 
d[1][2] ='a';

我还需要重载运算符为

T &operator[size_t i_1][size_t i_2]...[size_t i_D]; 

不存在。我该怎么做?

【问题讨论】:

    标签: c++ templates c++11 operator-overloading variadic


    【解决方案1】:

    最简单的方法是嵌套std::array

    #include<array>
    
    template<class T, size_t size, size_t... sizes>
    struct ArrayImpl {
        using type = std::array<typename ArrayImpl<T, sizes...>::type, size>;
    };
    
    template<class T, size_t size>
    struct ArrayImpl<T, size> {
        using type = std::array<T, size>;
    };
    
    template<class T, size_t... sizes>
    using Array = typename ArrayImpl<T, sizes...>::type;
    

    在此解决方案中,Array&lt;char, 3, 4&gt;std::array&lt;std::array&lt;char, 4&gt;, 3&gt; 相同 - 由较小维度的数组组成的数组。

    这还展示了如何为多个维度实现operator[]。您的对象的operator[] 需要返回还定义了operator[] 的对象。在这种情况下,它引用了一个较小维度的数组。

    【讨论】:

      【解决方案2】:

      试试这个:

      #include <iostream>
      
      template <typename T, int N1, int... N2>
      class Array
      {
      
      public:
      
          Array() {}
      
          ~Array() {}
      
          Array<T,N2...>& operator[](int index)
          {
              return data[index];
          }
      
      private:
      
          Array<T,N2...> data[N1];
      };
      
      template<typename T, int N>
      class Array<T,N>
      {
      
      public:
      
          Array() {}
      
          ~Array() {}
      
          T& operator[](int index)
          {
              return data[index];
          }
      
      private:
      
          T data[N];
      };
      
      int main()
      {
          Array < int, 2, 3, 4> a, b;
          Array < char, 3, 4> d;
          Array < short, 2> e;
      
          a[0][1][2] = 15;
          d[1][2]    = 'a';
      
          std::cout << "a[0][1][2] = " << a[0][1][2] << std::endl;
          std::cout << "d[1][2]    = " << d[1][2]    << std::endl;
      
          return 0;
      }
      

      您可能还想加入范围检查,也许还想加入一些迭代器 :)

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2011-10-26
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多