5

虽然我std::tr1::shared_ptr<T>的编译器中有可用的,但我没有make_shared.

有人可以指出我的正确实施make_shared吗?我看到我需要使用可变参数为 T 的构造函数提供参数。

但是我的编译器中也没有可用的可变参数模板。

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-value 引用,则为每个参数计算 2 个版本:一个const Arg&和一个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 回答