【问题标题】:Detect self-assignment in overloaded C++ operators检测重载 C++ 运算符中的自赋值
【发布时间】:2015-03-04 17:56:06
【问题描述】:

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

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

x = x op y

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

【问题讨论】:

  • x = x op y 不是自分配。您正在使用分配给xx op y 创建一个新值。
  • 所以您希望将x = x + y 转换为x += y
  • x op y 可以将带有转换运算符的类返回到 x 的类型。赋值运算符可以专门处理该类以优化它。这种优化形式有一个术语,遗憾的是我现在不记得了。
  • @ 0x499602D2 这正是我希望避免的。 @Approaching Yes 完全正确,但 op + 也必须能够检测到它(即 X += Y 和 X = X + Y 应该调用相同的函数)
  • @KarolyHorvath 完成。

标签: c++ class operator-overloading


【解决方案1】:

一种方法是让A op 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 以避免创建临时的,但我这里没有这样做。其他可能的优化是处理一系列操作以避免在每个步骤中创建临时操作。

【讨论】:

  • 这正是我想要的!我应该为关于链的评论添加 ++!太棒了。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2015-06-01
  • 2011-01-27
  • 2011-05-31
相关资源
最近更新 更多