1

我为 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 旧版本是否会支持此更改的插件。这是个好主意吗?请让我知道在这种情况下 boost 是否有用。

4

2 回答 2

1

首先,boost::shared_ptr几乎std::tr1::shared_ptr相同,但如果可以的话,你应该std::shared_ptr通过启用 C++11 支持来代替(我认为在 VS12 上默认,在 clang / llvm 中启用)。

shared_ptr是一个包装指针的模板类,因此在编译程序时会实例化整个代码:原始类实现驻留在头文件中,该头文件合并到您的翻译单元中(每个单独的文件都在构建)。

因此,您不需要使用任何特定的库shared_ptr(无论是 .dll 还是 .so 或 Mac 上的其他东西)。因此,您的程序将在为其构建的任何机器上运行,您不需要额外的库来运行它。

您还可以 - 出于兼容性原因 - 使用您自己的包装器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将根据您定义的宏解析为适当类型的内容。请注意,这仅适用于所有这些类型的兼容接口,但情况应该如此。

于 2013-06-11T12:37:55.663 回答
0

为什么不直接测试一下?一个简单的第一步是使用 atypedef在后台更改实际的共享指针定义:

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 版本)的支持,而无需更改代码。当然,所有选项都需要具有相同的接口,否则代码将无法编译。

于 2013-06-11T12:36:52.063 回答