C++中make_shared不可用

5

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

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

但是我也没有可用的变参模板。


2
没有可变参数模板,你需要多个版本的 make_shared,一个用于零个参数,一个用于一个参数,一个用于两个参数等等。 - Ben Voigt
@BenVoigt:可变参数模板并不是一个巨大的绊脚石。在C++03中缺少右值引用使得make_shared功能不如强大,但您仍然可以拥有单一分配实现优化以及工厂函数提供的异常安全性。 - Kerrek SB
你可以复制现有的实现(来自boost或支持最新标准但不使用可变参数模板的编译器)并使用它。我有一个闲置的,但它只适用于msvc,因为它依赖于他们的std :: tr1 :: _Ref_count_base和_Enable_shared。 - stijn
@Ben:这是 T const&T& 的区别。 - R. Martinho Fernandes
@R.MartinhoFernandes:哦,T可以明确指定为const something,但不会推断出来吗?是的,看起来是这样的:http://ideone.com/c3VF8 - Ben Voigt
显示剩余4条评论
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)));
}

// ...

如果您的编译器不支持右值引用,那么对于每一个参数数量,都需要制作两个版本:一个是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)... ));
}

Gigi的可变参数版本也像这里讨论的那样留下了适当的回溯信息:https://dev59.com/FmDVa4cB1Zd3GeqPb0zo - srking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接