我有一个对向量进行操作的代码:
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));
当第二个参数为时,当前代码将无法编译lvalue因为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));
}
Since V
可以是不同的类型T
, so emplace_back
makes more从某种意义上说,因为它不仅解决了问题,而且使代码更加通用。 :-)
现在下一个改进:因为我们正在使用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);
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)