![](/img/trans.png)
[英]How to handle evolving c++ std:: namespace? e.g.: std::tr1::shared_ptr vs. std::shared_ptr vs. boost::shared_ptr vs. boost::tr1::shared_ptr
[英]boost::shared_ptr vs std::tr1::shared_ptr on multi os compilation
我为Windows和Mac系统的浏览器插件(c ++)维护了不同的代码。 代码的区别仅在于共享指针。
在Windows版本中,我使用std :: tr1 :: shared_ptr;在Mac版本中,我使用boost :: shared_ptr。
现在我想将这些代码合并为一个代码,我想在两个代码中都使用std :: tr1 :: shared_ptr并维护单个源代码,但保留两个不同的solution / project文件夹。 该浏览器插件最多支持OSX 10.5以上版本。目前,我正在Xcode 4.6.2(Apple LLVM编译器)中进行编译。基本上,我是Windows程序员,主要在Visual Studio上工作。
我的问题是Mac较旧的版本是否将支持此更改的插件。这是个好主意吗? 请让我知道在这种情况下升压是否有用。
首先, boost::shared_ptr
和std::tr1::shared_ptr
几乎是相同的,但是如果可以的话,您应该使用std::shared_ptr
而不是启用C ++ 11支持(我认为是VS12的默认设置)在clang / llvm中)。
shared_ptr
是一个包装指针的模板类,因此,在编译程序时将实例化整个代码:原始类的实现驻留在包含在翻译单元中的头文件中(正在构建每个单独的文件)。
这样,您不需要任何特定的库即可使用shared_ptr
(在Mac上既不是.dll也不是.so或其他任何东西)。 因此,您的程序可以在构建了该程序的任何计算机上运行,而无需其他库即可运行它。
由于兼容性原因,您还可以在shared_ptr
周围使用自己的包装器:
namespace my_code {
#if defined(_STD_TR1_SHARED_PTR)
using std::tr1::shared_ptr;
#elif defined(_STD_SHARED_PTR)
using std::shared_ptr;
#else
using boost::shared_ptr;
#endif
}
因此,您可以访问my_code::shared_ptr
,它将根据您定义的宏解析为适当的类型。 请注意,这仅在所有类型都使用兼容接口的情况下才有效,但实际情况应该如此。
你为什么不测试呢? 第一步很简单,就是使用typedef
在typedef
更改实际的共享指针定义:
namespace myNs{
#ifdef _USE_STD_SRDPTR
typedef std::shared_ptr sharedPtr;
#else
typedef boost::shared_ptr sharedPtr; //default to boost if no symbol defined
#endif
}
//in code replace old shared pointer usage
myNs::sharedPtr<Fruit> ourFruit( new Banana(WONKY) );
这样,您可以在两个代码库中替换它,并在需要时更改基础实现。 您可以根据需要添加对更多选项(例如tr1版本)的支持,而无需更改代码。 当然,所有选项都必须具有相同的接口,否则代码将无法编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.