我为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旧版本将支持这个更改插件。这是一个好主意吗? 在这种情况下,请告诉我升压是否有用。
答案 0 :(得分:1)
首先,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
,根据您定义的宏,它将解析为适当的类型。请注意,这仅适用于所有类型的兼容接口,但情况应该如此。
答案 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版本)的支持,而无需更改代码。当然,所有选项都需要具有相同的接口,否则代码将无法编译。