C++ 泛型右值重载

C++ generic rvalue overload

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

假设我想制作一个 "augmented 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 << aa += 2,甚至是简单的 int b = a; 赋值编译器抱怨运算符 <<+= 丢失。

很公平;然后我尽管如此,至少对于 << 和 "assigment =",我可以通过使用某种 "generic rvalue operator" 或某种方法来获得 returns PowerInt.x在我的 a 用作右值的任何地方,自动使 int c = (a + 3);if (a == 3) {} 等表达式有效。

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

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

operator int() const
{
  return x;
}

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

定义的运算符

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