我有一些方法需要让他们能够通过 const 左值(它将被复制的地方)和右值引用(为了速度)获取变量
struct Object {
...
Object(Object&& o) { ... }
Object(const Object& o) { ... }
...
};
...
struct SomeClass {
...
Object arr[7];
void copy(int pos,const Object& o) { arr[pos] = o; }
void copy(int pos,Object&& o) { arr[pos] = o; }
...
};
因此,两个复制方法在 SomeClass 中是完全相同的。唯一的区别是,一个对象作为常量传递,它将被复制,而另一个对象作为右值引用传递以供快速复制使用。
这两个方法的代码完全相同。
现在,在上面的示例中并没有那么悲惨,但是,我有稍微大一点的方法,大约 9-15 行。显然,解决方法是像此处那样复制它们,但感觉不对。
如何重用复制方法的代码?
最佳答案
通用引用和 std::forward
让您实现完美转发。这是修改后的 copy
:
template <typename T>
void copy(int pos, T&& o) {arr[pos] = std::forward<T>(o);}
如果您担心从其他类型到 Object
的可能隐式转换, 您还可以添加 static_assert
在 copy
的正文中.如果传递左值 Object
至 copy
, T
将被推断为 Object&
. std::forward<Object&>
返回一个引用。因此,将选择复制赋值重载。如果传递右值 Object
至 copy
, T
将被推断为 Object
. std::forward<Object&>
返回 Object&&
.自 std::forward<Object>(o)
也是右值,移动赋值运算符将被选中。
关于C++,在函数中采用const左值和右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24795337/