【问题标题】:C++ generic rvalue overloadC++ 泛型右值重载
【发布时间】:2016-09-28 09:07:49
【问题描述】:

我目前正在尝试将一些使用原始类型的代码重构为可以将 setter 和 getter 塞入其中的东西。我想让底层代码的更改变得透明,起初我认为 C++ 的运算符重载会帮助我。

假设我想创建一个“增强的int”类型,例如,它可以像普通的int 一样对待,但允许在我分配给它的任何地方进行进一步的操作,并且只是分配 - 所有其他应保留 int 的属性,例如添加 +=

起初我认为如果我将int 封装在某个结构中,并填写operator= 重载,我会被设置,如下例所示:

#include<iostream>

typedef struct PowerInt{
  int x;

  PowerInt(){
    cout << "PowerInt created\n";
    x = 0;
  }
  ~PowerInt(){
    cout << "PowerInt destroyed\n";
  }

  void operator=(int other){
    cout << "PowerInt received " << other << "\n";
    this->x = other;
  }
}PowerInt;

int main(){
  PowerInt a;
  a = 3;
  return 0;
}

代码按预期编译和运行,但是一旦我尝试做任何其他常规 int 可以做的事情,比如cout &lt;&lt; a,或a += 2,甚至是简单的int b = a; 赋值,编译器就会抱怨运算符&lt;&lt;+= 不见了。

很公平;然后我尽管如此,至少对于&lt;&lt; 和“分配=”,我可以通过使用某种“通用右值运算符”或某种返回PowerInt.x 的方法来获得我的a 被使用的地方作为右值,自动使int c = (a + 3);if (a == 3) {} 等表达式有效。

问题是,我找不到实现这个习语的方法,这很可能与我对 C++ 中运算符重载的工作原理知之甚少有关,或者与我尚不了解的某些语言特性有关。是否有可能完成我在这里尝试的事情?

【问题讨论】:

  • 我看不到与rvalue的关系
  • 这里有一些不必要的 C-isms 你知道
  • @LightnessRacesinOrbit 你可以把它们指向我,因为在用 C 语言编程近十年之后,我现在只是在摸索 C++ 的表面,你知道的。 :)
  • typedef struct T { } T; .... 只要struct T {}; 就可以了。如果您想与 C 代码共享您的 struct 定义,那么可以保持它兼容,但是由于这个具有 C++ 类特性,您肯定不会这样做。

标签: c++ operator-overloading rvalue


【解决方案1】:

如果您希望您的PowerInt 可转换为普通的int,您可以创建一个用户定义的转换运算符:

operator int() const
{
  return x;
}

任何未为PowerInt 定义的运算符将使用为普通int 定义的运算符。

P.S typedef struct 在 C++ 中不是必需的。

【讨论】:

  • 傻,傻我。这以我想要的方式解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多