我有两个课程,我们称他们为A
和B
。我在课程operator+=
中重载了A
。现在我想做这样的事情:
A += B + B + B
课程B
并没有超载operator+
,这是一个问题,因为评估是从右到左(它想要添加所有B
然后+ =结果A
)。
有没有办法实现我的目标,而没有真正为课程operator+
重载B
?
答案 0 :(得分:1)
有没有办法实现我的目标,而没有真正为课程
operator+
重载B
?
总之,否。
A::operator+=
需要B
作为输入,因此如果您需要A += B + B + B to work
,则需要一种方法将B
个对象添加到一起以生成新的B
+=
可以作为输入,这正是operator+
的意思。
答案 1 :(得分:0)
这是可能的。
您可以使B
隐式转换为算术类型,而不是重载加法运算符。一个演示,不需要根据要求为operator+
重载B
,但允许您想要的确切表达式:
struct B {
B() = default;
// this constructor makes B convertible from int
B(int){}
// this operator makes B convertible to int
operator int() {
return 42;
}
};
struct A {
A& operator+=(const B&) {
return *this;
}
// alternative:
// if you use this, then B does not need to convert from int
// A& operator+=(int)
};
int main() {
A A;
B B;
A += B + B + B;
}