我有一个对 vector 进行操作的代码:
template<typename T>
void doVector(vector<T>& v, T&& value) {
//....
v.push_back(value);
//...
}
对于普通的push_back
,我需要使用forward(value)
、move(value)
还是只需要value
(根据新的 C++11)?它们对性能有何影响?
例如,
v.push_back(forward<T>(value));
最佳答案
当第二个参数为左值时,当前代码将无法编译,因为T&&
结果是X&
这意味着 T
需要X&
这又意味着 std::vector<T>
将变为 std::vector<X&>
这将不匹配第一个参数 std::vector<X> &
.因此,这是一个错误。
我会使用两个模板参数:
template<typename T, typename V>
void doVector(vector<T> & v, V && value)
{
v.emplace_back(std::forward<V>(value));
}
自从 V
可以是与 T
不同的类型吗? , 所以 emplace_back
使更多有意义,因为它不仅解决了问题,而且使代码更通用。 :-)
现在进行下一个改进:因为我们使用的是 emplace_back
它创建了 T
类型的对象来自参数 value
(可能使用构造函数),我们可以利用这一事实,并使其成为可变函数:
template<typename T, typename ...V>
void doVector(vector<T> & v, V && ... value)
{
v.emplace_back(std::forward<V>(value)...);
}
这更通用,因为您可以将其用作:
struct point
{
point(int, int) {}
};
std::vector<point> pts;
doVector(pts, 1, 2);
std::vector<int> ints;
doVector(ints, 10);
希望对您有所帮助。
关于c++ - 我什么时候应该使用前进和移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214434/