C++ 使用boost::shared_ptr,以便以后替换它

C++ 使用boost::shared_ptr,以便以后替换它,c++,boost,shared-ptr,template-aliases,C++,Boost,Shared Ptr,Template Aliases,我正在研究需要共享指针的跨平台代码。由于我无法控制的原因,我们现在还不能使用C++11。因此,我建议使用boost::shared\u ptr。当我们采用C++11时(可能一年后),我们应该能够用std智能指针取代boost智能指针。我的问题是关于使用boost的最佳方式,以便以后更容易切换。模板别名不可用,因此出现以下情况: namespace my { template <typename T> using shared_ptr = boost::shared_p

我正在研究需要共享指针的跨平台代码。由于我无法控制的原因,我们现在还不能使用C++11。因此,我建议使用boost::shared\u ptr。当我们采用C++11时(可能一年后),我们应该能够用std智能指针取代boost智能指针。我的问题是关于使用boost的最佳方式,以便以后更容易切换。模板别名不可用,因此出现以下情况:

namespace my {
    template <typename T>
    using shared_ptr = boost::shared_ptr<T>;
}

然后使用
my::shared\u ptr
。稍后,我将
名称空间my
中的
boost
更改为
std
。但是,我无法决定每种方法的赞成和反对意见,以作出决定。

四个与C++98兼容的选项

1) 使用
impl::shared_指针
。并从以下位置切换:

namespace impl=boost
名称空间impl=std

2) (更优雅但风险更大)是使用
shared\u ptr
而不使用名称空间限定,然后从

使用boost::shared_ptr
使用std::shared_ptr

3) (难看,但我想这是首选的工业解决方案)始终使用宏

#if DETECTC++11
#define SHARED_PTR std::shared_ptr
#else
#define SHARED_PTR boost::shared_ptr
#endif
4) 将以上三种方法结合起来

匿名名称空间有助于使用
语句将
保持在文件的本地,因此您可以对每个源文件进行控制,例如:

namespace{
  using std::shared_ptr;
}

(我个人一直在使用2.。

在我们的项目中,我们会这样做:

#if compiler_doesnt_support_c++11
  #include <boost/shared_ptr.hpp>

  namespace std {
    using boost::shared_ptr;
  }
#elif compiler_has_c++11_in_tr1
  #include <memory>
  namespace std {
    using std::tr1::shared_ptr;
  }
#else
  #include <memory>
#endif
如果编译器不支持c++11 #包括 名称空间标准{ 使用boost::shared\u ptr; } #elif编译器\u在\u tr1中有\u c++11\u #包括 名称空间标准{ 使用std::tr1::shared\u ptr; } #否则 #包括 #恩迪夫
只需在代码中使用
std::shared_ptr


是的,它在技术上是未定义的行为(因为您不允许向
::std
名称空间添加这样的名称),但多年来它一直没有出现任何问题。

纯文本替换可能是一种可行的选择。
boost::shared\u ptr
->
std::shared\u ptr
不太可能在任何地方出错。我不想在以后用
std
替换
boost
整个源代码:(您可以编写一个三行脚本来完成此操作。请注意,boost/std名称空间不是唯一的更改。如果使用占位符,C++11会将它们放在std::placeholders名称空间中,因此boost::_1将成为std::placeholders:::_1,如果编译器不支持,它将是std::shared_ptr的别名,或者是std::tr1::shared_ptr下的boost实现。Thanks的建议。2对我来说有点冒险。我讨厌在3中使用宏。我喜欢1和4-我用这两个的变体编辑了我的问题。没有“技术上的UB”,只有“UB”:-@TemplateRex;-),你是对的。但是“UB很可能会以糟糕的结果结束(例如读取未初始化的值)”和“UB很可能会正常(例如向
:std添加符号,标准库中没有引用该符号)”之间存在差异,编译器可以在名称空间
std
中维护所有标准强制标识符的列表,并在遇到您的东西时中止编译或释放鼻魔。@TemplateRex当然可以。但我知道没有一个编译器能做到这一点。我指的就是这个,“UB”是什么意思?
namespace{
  using std::shared_ptr;
}
#if compiler_doesnt_support_c++11
  #include <boost/shared_ptr.hpp>

  namespace std {
    using boost::shared_ptr;
  }
#elif compiler_has_c++11_in_tr1
  #include <memory>
  namespace std {
    using std::tr1::shared_ptr;
  }
#else
  #include <memory>
#endif