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