コンパイラでstd::tr1::shared_ptr<T>
利用できますが、ありませんmake_shared
。
誰かがの適切な実装を教えてもらえますかmake_shared
? T のコンストラクターに引数を提供するには、varargs を使用する必要があることがわかりました。
しかし、私のコンパイラでも利用できる可変個引数テンプレートはありません。
コンパイラでstd::tr1::shared_ptr<T>
利用できますが、ありませんmake_shared
。
誰かがの適切な実装を教えてもらえますかmake_shared
? T のコンストラクターに引数を提供するには、varargs を使用する必要があることがわかりました。
しかし、私のコンパイラでも利用できる可変個引数テンプレートはありません。
コンパイラがmake_sharedの実装を提供せず、boostを使用できず、オブジェクトと参照カウンターの両方に単一割り当ての最適化がないことを気にしない場合、make_sharedは次のようになります。
可変個引数テンプレートのサポートなし:
// zero arguments version
template <typename T>
inline shared_ptr<T> make_shared()
{
return shared_ptr<T>(new T());
}
// one argument version
template <typename T, typename Arg1>
inline shared_ptr<T> make_shared(Arg1&& arg1)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1)));
}
// two arguments version
template <typename T, typename Arg1, typename Arg2>
inline shared_ptr<T> make_shared(Arg1&& arg1, Arg2&& arg2)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1),
std::forward<Arg2>(arg2)));
}
// ...
コンパイラがr値参照をサポートしていない場合は、引数ごとに2つのバージョンをカウントします。1つはconst Arg&、もう1つはArg&です。
可変個引数テンプレートのサポートあり:
template <typename T, typename... Args>
inline shared_ptr<T> make_shared(Args&&... args)
{
return shared_ptr<T>(new T( std::forward<Args>(args)... ));
}