c++泛型右值重载

C++ generic rvalue overload

本文关键字:重载 泛型 c++      更新时间:2023-10-16

我目前正在尝试重构一些使用原始类型的代码,我可以将setter和getter放入其中。我想让底层代码的改变透明,一开始我认为c++的操作符重载会帮我解决这个问题。

让我们假设我想创建一个"增强的int"类型,例如,它可以像普通的int一样处理,但允许在我对其赋值的任何地方进行进一步的操作,并且只是赋值- int的所有其他属性,例如与+=相加,都应该保留。

起初,我首先想到,如果我将int封装在某个结构体中,并填充operator=重载,我就会设置,就像下面的例子一样:

#include<iostream>
typedef struct PowerInt{
  int x;
  PowerInt(){
    cout << "PowerInt createdn";
    x = 0;
  }
  ~PowerInt(){
    cout << "PowerInt destroyedn";
  }
  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;赋值,编译器就会抱怨缺少操作符<<+=

好了;然后我认为,至少对于<<和"分配=",我可以通过使用某种"泛型右值运算符"来获得,或者某种方法返回PowerInt.x,无论我的a用作右值,自动使int c = (a + 3);if (a == 3) {}等表达式有效。

问题是,我找不到实现这个习惯用法的方法,这很可能与我对c++中操作符重载如何工作的理解很少有关,或者与我还不知道的一些语言特性有关。有可能完成我在这里尝试的事情吗?

如果您希望将PowerInt转换为正常的int,您可以创建一个用户定义的转换操作符:

operator int() const
{
  return x;
}

任何未为PowerInt定义的操作符将使用为正常int定义的操作符。

p。C++中不需要typedef struct