【问题标题】:overload () operator for multidimensional data access用于多维数据访问的重载 () 运算符
【发布时间】:2017-08-16 11:05:10
【问题描述】:

我想访问一个类中的多维数据,我发现:

提供多维数组访问语义,例如要实现 3D 数组访问 a[i][j][k] = x;,operator[] 必须返回对 2D 平面的引用,它必须有自己的 operator[] 返回对 1D 行的引用,它必须有 operator[] 来返回对元素的引用。为了避免这种复杂性,一些库选择重载 operator(),以便 3D 访问表达式具有类似 Fortran 的语法 a(i, j, k) = x;

http://en.cppreference.com/w/cpp/language/operators

并且我想使用建议的语法,但我在实施时遇到了麻烦。我怎样才能编写重载赋值运算符以这种方式工作?

【问题讨论】:

  • Eigen 库可能就是这样做的。另外:你有什么烦恼?
  • 是的,我使用了 Eigen,但有趣的是,这次 gcc 4.6 是我的极限...... :( 但好主意,我会尝试搜索他们是如何做到的。
  • 你不需要重载赋值运算符。你只需要让()返回一个引用。
  • 我很困惑如何获得正确的语法,你能发一些例子吗?
  • 你试过什么?您究竟在实施它时遇到了什么困难?

标签: c++


【解决方案1】:

例如,它会是

template <typename T, std::size_t S1, std::size_t S2, S3>
struct Matrix3D
{
    // ...

     const T& operator()(std::size_t i, std::size_t j, std::size_t k) const {
          return data[i][j][k];
     }
     T& operator()(std::size_t i, std::size_t j, std::size_t k) {
          return data[i][j][k];
     }
private:
    T data[S1][S2][S3];
};

【讨论】:

    【解决方案2】:

    感谢您的帮助,我有一个解决方案:

    T& operator()(unsigned width, unsigned height) {
        return my_data[width + height * data_width];
    }
    

    双向工作:

    my_class(1,2) = value;
    value = my_class(1,2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多