工廠功能
假設我們要編寫一個接受任意引數列表的工廠函式,並將那些未修改的引數傳遞給另一個函式。這種函式的一個例子是 make_unique
,它用於安全地構造 T
的新例項並返回擁有該例項的 unique_ptr<T>
。
關於可變引數模板和右值引用的語言規則允許我們編寫這樣的函式。
template<class T, class... A>
unique_ptr<T> make_unique(A&&... args)
{
return unique_ptr<T>(new T(std::forward<A>(args)...));
}
橢圓 ...
的使用表示引數包,其表示任意數量的型別。編譯器會將此引數包擴充套件為呼叫站點上正確數量的引數。然後使用 std::forward
將這些引數傳遞給 T
的建構函式。需要此函式來保留引數的 ref 限定符。
struct foo
{
foo() {}
foo(const foo&) {} // copy constructor
foo(foo&&) {} // copy constructor
foo(int, int, int) {}
};
foo f;
auto p1 = make_unique<foo>(f); // calls foo::foo(const foo&)
auto p2 = make_unique<foo>(std::move(f)); // calls foo::foo(foo&&)
auto p3 = make_unique<foo>(1, 2, 3);