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