虽然我编译器中有std::tr1::shared_ptr<T>
,但我没有make_shared
。
有人能给我指出make_shared
的正确实现吗?我看到需要使用变参来为T的构造函数提供参数。
但是我也没有可用的变参模板。
虽然我编译器中有std::tr1::shared_ptr<T>
,但我没有make_shared
。
有人能给我指出make_shared
的正确实现吗?我看到需要使用变参来为T的构造函数提供参数。
但是我也没有可用的变参模板。
// 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)));
}
// ...
如果您的编译器不支持右值引用,那么对于每一个参数数量,都需要制作两个版本:一个是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)... ));
}
make_shared
,一个用于零个参数,一个用于一个参数,一个用于两个参数等等。 - Ben Voigtmake_shared
功能不如强大,但您仍然可以拥有单一分配实现优化以及工厂函数提供的异常安全性。 - Kerrek SBT const&
和T&
的区别。 - R. Martinho FernandesT
可以明确指定为const something
,但不会推断出来吗?是的,看起来是这样的:http://ideone.com/c3VF8 - Ben Voigt