检测重载C++运算符中的自赋值
Detect self-assignment in overloaded C++ operators
如果这是重复的,请原谅;我搜索了一下,但正确的方言可能超出了我的理解范围。
我的目标是一些任意类和过载的操作员
x = x op y
会意识到它是自赋值的,而不是直接生成一个临时变量op=到x(我不想重载op=)。有办法做到这一点吗?
实现此操作的一种方法是让A
操作A
返回另一个类APlusA
的临时对象,而不执行操作本身。这个类有一个到A
的转换运算符,它在需要时执行实际计算。
诀窍是在类A
中实现operator=
的一个版本,该版本接受APlusA
的临时对象。如果它识别出它正在对同一对象进行操作,那么它就可以在不创建临时A
对象的情况下就地执行操作。这里有一个例子(在ideone上测试):
#include <iostream>
struct A {
struct APlusA {
APlusA(const A&a_, const A&b_) : a(a_), b(b_) {}
const A &a;
const A &b;
operator A() const {
std::cout << "Creating temporary A" << std::endl;
return A(a.val + b.val);
}
};
A(int val_) : val(val_) {}
friend APlusA operator+(const A&a, const A&b) { return APlusA(a,b); }
friend std::ostream &operator<<(std::ostream &s, const A &a) { return s << a.val;}
A& operator=(const APlusA &apa) {
if (this == &apa.a) {
std::cout << "Performing in-place operation" << std::endl;
val += apa.b.val;
}
else
{
*this = static_cast<A>(apa);
}
return *this;
}
int val;
};
用法示例:
int main() {
A a(4), b(5), c(6);
std::cout << a+b << std::endl; //Temporary created
a = b+c; //Temporary created
a = a+b; //No temporary - inplace operation
std::cout << a << std::endl;
return 0;
}
也可以优化a = b + c
以避免创建临时的,但我在这里还没有这样做。其他可能的优化是处理一系列操作,以避免在每个步骤创建临时操作。
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- C++ 通过自定义赋值运算符隐式转换函数参数
- 赋值运算符的奇怪行为
- C++赋值运算符,我们可以用 copy 替换它吗?