繁体   English   中英

在多操作系统编译中,boost :: shared_ptr与std :: 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_ptrstd::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 ,它将根据您定义的宏解析为适当的类型。 请注意,这仅在所有类型都使用兼容接口的情况下才有效,但实际情况应该如此。

你为什么不测试呢? 第一步很简单,就是使用typedeftypedef更改实际的共享指针定义:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM