【问题标题】:A 'typedef' for a template function (boost::make_shared)模板函数的 'typedef' (boost::make_shared)
【发布时间】:2012-11-02 14:12:09
【问题描述】:

我正在将我的项目迁移到 C++11,并尝试尽可能多地使用标准库。

在完成迁移之前,我需要一种快速的方法来在 shared_ptr 的 boost 和 STL 实现之间切换(进行基准测试、单元测试等)。

所以我为shared_ptr 定义了一个别名,如下所示:

#ifdef _USE_BOOST_
template <class C>
using shared_ptr = boost::shared_ptr<C>
#else
template <class C>
using shared_ptr = std::shared_ptr<C>
#endif 

现在我需要为make_shared 做同样的事情...但是怎么做呢?宏?一个包装?我真的不喜欢他们中的任何一个。有哪些替代方案?

【问题讨论】:

  • 你别无选择,只能写一个快速包装器。

标签: c++ boost stl c++11


【解决方案1】:

使用可变参数模板和完美转发:

template<typename C, typename...Args>
shared_ptr<C> make_shared(Args &&...args) {
#ifdef _USE_BOOST_
  return boost::make_shared<C>(std::forward<Args>(args)...);
#else
  return std::make_shared<C>(std::forward<Args>(args)...);
#endif
}

【讨论】:

  • 正是我写的答案,但你打败了我。
  • 这就是我所做的,但我不喜欢结果 shared_ptr 被复制两次。
  • 我很确定副本会优化出来
  • 使用 c++11 不会复制,在最坏的情况下会输出moved,但更有可能启动返回值优化。
  • 接受,因为这是一个完全有效的答案。我似乎没有任何其他选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多