例如:
mat33 operator +(mat33& m1, mat33& m2);
mat33 operator -(mat33& m1, mat33& m2);
mat33 operator +(mat33&& m1, mat33&& m2);
mat33 operator -(mat33&& m1, mat33&& m2);
mat33 operator +(mat33&& m1, mat33& m2);
mat33 operator -(mat33&& m1, mat33& m2);
mat33 operator +(mat33& m1, mat33&& m2);
mat33 operator -(mat33& m1, mat33&& m2);
有无什么方法可以简化这一大串?
如果你想要减少声明的次数,那是有办法的,简化代码似乎不可能。按照你的声明思路,
&&,&&
和&&,&
可以将工作代理给&,&&
。这样代码不复杂,也没有重复。这里至少需要两个实现,其中一个移动数据,另一个不移动数据。移动数据分lhs和rhs。同时还要兼顾ADL。实现这些至少需要声明三个重载。用模板可以将声明减少到两个:
PS: c++17后可以用constexpr if实现静态分枝。c++17之前编译器也通常可以完成这样的优化。
测试代码:
不就搞定了。。。
const & 能匹配所有引用(左值、右值、常量左值、常量右值)。