模板函数的'typedef'(boost :: make_shared)

6 c++ boost stl c++11

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

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

所以我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 
Run Code Online (Sandbox Code Playgroud)

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

eca*_*mur 7

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

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
}
Run Code Online (Sandbox Code Playgroud)

  • 我很确定副本会优化出来 (2认同)
  • 使用c ++ 11将不会复制,在最坏的情况下,它将被"移出",但更有可能返回值优化. (2认同)