【问题标题】:How to overload operator [][]如何重载运算符 [][]
【发布时间】:2017-10-10 11:58:56
【问题描述】:

我的问题是如何重载运算符 [][] ? 另外,当我调用操作员的分机时,幕后发生了什么?

【问题讨论】:

  • 这两个都不是单一的操作符。
  • 顺便说一句,这个问题闻起来像XY problem。当你说出你想要达到的目标时,你可能会得到更有用的答案。
  • 请不要“超载”--->。您可以使用返回具有operator-> 的代理的operator--(int) 来执行此操作,但这种不寻常的语法非常令人困惑。
  • @Murphy 我试图为这个问题找到一个通用的解决方案。我从事在具有不同维度的矩阵中使用的项目,我找到了 2-demnsions 问题的解决方案,但是对于我没有找到的第 n 个维度问题,我的解决方案没有帮助我理解如何将它扩展到第 n 个维度

标签: c++ operator-overloading operators


【解决方案1】:

正确的说法是运算符重载

要实现某种[][],您需要为第一个[] 返回一个代理对象,在该对象上再次重载运算符[]

()() 的链可以用类似的方式完成。

对于 slide operator 类型,请参阅What is the "-->" operator in C++?

【讨论】:

  • 谢谢,你知道幕后发生了什么吗?能够将其扩展到第 n'th []
  • 好吧,代理对象可以是模板化的 *degree" 模板。不过这可能会变得很混乱。为什么不使用带有可变参数列表的()
  • 如果他们扩展 operator[] 以接受用户定义类型的多个参数,我将是一个快乐的露营者
  • 如果中间对象有意义,[] 解决方案会更好。例如,如果 2D 数组的 operator[] 返回对 1D 数组的引用,该 1D 数组本身就具有完整功能。如果您必须创建代理对象,我更喜欢使用operator()
  • @patatahooligan - 我不喜欢它。在不是函子的东西上重载函数调用运算符感觉很奇怪......虽然我想有人可能会争辩说矩阵是从有序索引对到基础字段的函数......所以IDK。
【解决方案2】:

运算符[][]...()()...-->(至于最后一个,我假设您不是指--->)实际上不是c++ 运算符,而是c++ 运算符的组合。

例如[][][],将[]应用于左值,并返回某个左值,再次应用[],然后第三次相同。所以没有实际的[][][],只是[]应用了3次。

int a[2] = {0,1};
int b[3] = {2,3,4};
int *c[2] = {a,b};

c[0][1]; // [0] first extracts 'a' from 'c', then [1] extracts 1 from a (the value in the second index).

()()() 也是如此。

-->也是同样的思路,只不过这里不是同一个操作符的重复组合,而是--的组合,会返回左值再减1,和> ,它将比较左侧和右侧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多