当第二个参数是左值时,当前代码将无法编译,因为T&&
结果会是X&
which 意味着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
whichT
从参数创建类型的对象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);
希望有帮助。