我想知道,假设我有一些大对象,比如一个矩阵,并且我想提供一些功能来以某种方式修改这个对象(在矩阵的情况下,我们可能希望反转矩阵)。
实现反转功能的最佳方法是什么?
想到四个选项:
- 我们可以有一个成员函数 Matrix::invert() 来反转自身。
- 成员函数可以构造一个新的倒置矩阵(类似于
std::string::substr
) - invert 可以是一个接受和修改引用的非成员函数:
void invert(matrix& m)
- invert 可以是一个非成员函数,它按值获取一个矩阵,反转它,然后返回它:
matrix invert(matrix m)
现在,第四个选项对我来说似乎是最好的,因为如果用户希望保留原始矩阵,则不会修改原始矩阵:
auto m = matrix{};
auto m2 = invert(m);
如果他们只想要倒置矩阵,他们可以这样做:
auto m = matrix{};
auto m2 = invert(move(m));
或者
auto m = invert(matrix{})
(这应该是有效的,因为新构建的矩阵将被移入倒置,修改,然后 rvo'd 或移出到 m)
但这违背了影响类表示的操作应该作为成员函数实现的想法。所以理想情况下,我想要一种实现成员函数的方法matrix& matrix::invert()
,如果它在右值上被调用,它会修改父矩阵,但如果它在左值上被调用,它会保持原样并返回一个新矩阵。这会是正确的方法吗?以及如何实施?
另一种选择可能是实现一个修改原始成员的成员,以及一个“做正确的事情”的非成员,具体取决于参数是右值(在这种情况下它将被移动)还是左值(在这种情况下将制作一份副本)。这仍然有两个缺点:
- 更多代码,因为现在我们有两个反转函数
- 链接很尴尬,因为我们可能想说 m.invert() 但不想修改原始矩阵。
示例:https ://gist.github.com/mfaizan/6631482
谢谢!