我正在添加新的运算符重载以利用 c++0x 右值引用,并且我觉得我正在生成大量冗余代码。
我有一个类,tree
它包含一个对双值的代数运算树。这是一个示例用例:
tree x = 1.23;
tree y = 8.19;
tree z = (x + y)/67.31 - 3.15*y;
...
std::cout << z; // prints "(1.23 + 8.19)/67.31 - 3.15*8.19"
对于每个二元运算(如加号),每一边都可以是左值tree
、右值tree
或double
. 这导致每个二元操作有 8 个重载:
// core rvalue overloads for plus:
tree operator +(const tree& a, const tree& b);
tree operator +(const tree& a, tree&& b);
tree operator +(tree&& a, const tree& b);
tree operator +(tree&& a, tree&& b);
// cast and forward cases:
tree operator +(const tree& a, double b) { return a + tree(b); }
tree operator +(double a, const tree& b) { return tree(a) + b; }
tree operator +(tree&& a, double b) { return std::move(a) + tree(b); }
tree operator +(double a, tree&& b) { return tree(a) + std::move(b); }
// 8 more overloads for minus
// 8 more overloads for multiply
// 8 more overloads for divide
// etc
对于每个二元运算(减、乘、除等),也必须以某种方式重复。
如您所见,我实际上只需要编写 4 个函数;其他 4 个可以转换并转发到核心案例。
您对减小此代码的大小有什么建议吗?
PS:这个类实际上比一个双打树更复杂。减少副本确实显着提高了我的项目的性能。所以,右值重载对我来说是值得的,即使有额外的代码。我怀疑可能有一种方法可以将上面的“cast and forward”案例模板化,但我似乎想不出任何东西。