gpt4 book ai didi

c++ - 检测重载 C++ 运算符中的自赋值

转载 作者:太空狗 更新时间:2023-10-29 21:41:25 29 4
gpt4 key购买 nike

如果这是重复的,请原谅我;我搜索了一下,但正确的白话可能超出了我的理解范围。

我对一些任意类和重载运算符的目标

x = x op y

会识别它是自赋值的,而不是直接为 x 生成一个临时变量 op=(我不只是想重载 op=)。有办法做到这一点吗?

最佳答案

一种方法是让 A 操作 A 返回另一个类 APlusA 的临时对象,而不执行操作本身呢。此类有一个到 A 的转换运算符,可在需要时执行实际计算。

诀窍在于,在 A 类中,您实现了一个 operator= 版本,它采用 APlusA 的临时对象。如果它识别出它正在对同一个对象进行操作,则它可以就地执行操作,而无需创建临时的 A 对象。这是一个示例 ( test on 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 来避免创建临时文件,但我在这里没有这样做。其他可能的优化是处理一系列操作,以避免在每一步都创建一个临时对象。

关于c++ - 检测重载 C++ 运算符中的自赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861496/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com