std::make_unique
標準C ++ 11ライブラリに関数テンプレートがないのはなぜですか?見つけた
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
少し冗長。次の方がずっといいと思いませんか?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
これはnew
見事に非表示になり、タイプについては1回だけ言及します。
とにかく、ここに私の実装の試みがありますmake_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
std::forward
コンパイルするのにかなり時間がかかりましたが、それが正しいかどうかはわかりません。それは...ですか?正確にはstd::forward<Args>(args)...
どういう意味ですか?コンパイラはそれを何で作っていますか?
make_unique
カスタム削除を使用してパラメーター化しても意味がないと思います。明らかにプレーンオールドnew
を介して割り当てられるため、プレーンオールドを使用する必要がありますdelete
:)
make_unique
はnew
割り当てに限定されます...まあ、あなたがそれを書きたいと思っても大丈夫ですが、そのようなものが標準の一部ではない理由を私は見ることができます。
make_unique
、のコンストラクタstd::unique_ptr
は明示的でありunique_ptr
、関数から戻るのは冗長であるため、テンプレートを使用するのが好きです。また、私はではなく使用したいauto p = make_unique<foo>(bar, baz)
ですstd::unique_ptr<foo> p(new foo(bar, baz))
。
unique_ptr
、何とか許可する必要のある2番目のテンプレートパラメーターを受け取ることにも注意してください。これはとは異なりshared_ptr
ます。