虽然我std::tr1::shared_ptr<T>
的编译器中有可用的,但我没有make_shared
.
有人可以指出我的正确实施make_shared
吗?我看到我需要使用可变参数为 T 的构造函数提供参数。
但是我的编译器中也没有可用的可变参数模板。
虽然我std::tr1::shared_ptr<T>
的编译器中有可用的,但我没有make_shared
.
有人可以指出我的正确实施make_shared
吗?我看到我需要使用可变参数为 T 的构造函数提供参数。
但是我的编译器中也没有可用的可变参数模板。
如果您的编译器没有提供 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)... ));
}