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 << a
或 a += 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++ 中不是必需的。
我目前正在尝试将一些使用原始类型的代码重构为可以将 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 << a
或 a += 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++ 中不是必需的。