【问题标题】:Global Operator "->" overload C++全局运算符“->”重载 C++
【发布时间】:2017-11-07 03:32:15
【问题描述】:

我想为指针全局重载“->”运算符。有可能吗?

A *var1 = new A(21);
int x = var1->someInt;

在该代码中,必须在到达“var1”的“someInt”变量时触发它。

实际上,我正在尝试在到达其成员之前检查指针。另外,我正在尝试在书面代码上实现这个系统,所以我不想在实际代码中更改太多东西。

【问题讨论】:

  • This operator overload reference 应该会告诉您您需要了解的内容。从逻辑上考虑它也会回答您的问题(object member-access 运算符如何在没有对象的情况下工作?)。
  • 你希望这个运算符在不带任何参数的情况下做什么?
  • 如果我没记错的话,语言定义要求operator->是一个成员函数。

标签: c++ operator-overloading


【解决方案1】:

我想在全局范围内重载“->”运算符。有可能吗?

不,这是不可能的。

也许您可以在您的库或程序中定义一个“根”类(将定义该运算符->),并让您的所有类都继承自它。

顺便说一句,我不确定您是否能够在所有情况下(包括任何类类型的有效自动变量的地址)并且有效地定义您的 isPointerValid 函数。

在很多情况下您无法定义这样的函数(例如,tagged union 类型中使用的union-s;您不容易知道联合的哪个成员当前处于活动状态。任意转换;... ); .

对于现有的代码和类,-> 的内置含义(您通常无法重新定义)已经用于编译使用它们的代码。

【讨论】:

  • 好主意,声明一个根类,但我试图在书面代码上使用这个系统。所以我不能改变那么多。
  • 这应该进入你的问题(而且不可能)。您需要改进您的问题,以更多地解释真正的动机和背景。
【解决方案2】:

如第 16.5.6 节中的 C++17 标准草案所述(重点是我的):

操作符函数要么是非静态成员函数,要么是 是一个具有至少一个参数类型的非成员函数 是类、对类的引用、枚举或对 枚举。

因此,不能重载不带任何参数的运算符。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多