5

コンパイラでstd::tr1::shared_ptr<T>利用できますが、ありませんmake_shared

誰かがの適切な実装を教えてもらえますかmake_shared? T のコンストラクターに引数を提供するには、varargs を使用する必要があることがわかりました。

しかし、私のコンパイラでも利用できる可変個引数テンプレートはありません。

4

1 に答える 1

6

コンパイラが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)... ));
}
于 2012-02-03T22:12:17.583 に答える