在多os编译上boost :: shared_ptr vs std :: tr1 :: shared_ptr

时间:2013-06-11 10:57:18

标签: c++ macos boost xcode4 shared-ptr

我为windows和mac系统维护了不同的浏览器插件(c ++)代码。代码的区别仅在于共享指针 在Windows版本中,我使用std :: tr1 :: shared_ptr,在Mac版本上使用boost :: shared_ptr。

现在我想将这些代码合并为一个。我想在两个代码中使用std :: tr1 :: shared_ptr并维护单个源代码,但是有两个不同的解决方案/项目文件夹。 这个浏览器插件支持OSX 10.5以后。目前我正在编译Xcode 4.6.2(Apple LLVM编译器)。基本上我是Windows程序员,主要是在Visual Studio上工作。

我的问题是Mac旧版本将支持这个更改插件。这是一个好主意吗? 在这种情况下,请告诉我升压是否有用。

2 个答案:

答案 0 :(得分:1)

首先,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,根据您定义的宏,它将解析为适当的类型。请注意,这仅适用于所有类型的兼容接口,但情况应该如此。

答案 1 :(得分:0)

你为什么不试试呢?一个简单的第一步是使用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版本)的支持,而无需更改代码。当然,所有选项都需要具有相同的接口,否则代码将无法编译。