2 番目の引数がlvalueの場合、現在のコードはコンパイルされません。これは、がであることがT&&判明するためです。したがって、これはエラーです。X&TX&std::vector<T>std::vector<X&>std::vector<X> &
2 つのテンプレート パラメータを使用します。
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型のオブジェクトを作成する(おそらくコンストラクターを使用して) を使用しているため、この事実を利用して、可変引数関数にすることができます。Tvalue
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);
それが役立つことを願っています。