6

我正在研究需要共享指针的跨平台代码。由于我无法控制的原因,我们还不能使用 C++11。所以,我建议使用 boost::shared_ptr。当我们确实采用 C++11(可能一年后)时,我们应该能够用 std 智能指针替换 boost 智能指针。我的问题是关于使用 boost 的最佳方式,以便以后更容易切换。模板别名不可用,因此以下内容不可用:

namespace my {
    template <typename T>
    using shared_ptr = boost::shared_ptr<T>;
}

将 shared_ptr 包装在另一个结构中的另一种技术会导致丑陋且不可读的 API,因为我将不得不因此使用它my::shared_ptr<int>::type

 namespace my  {
     template<typename T>
     struct shared_ptr
     {
          typedef boost::shared_ptr<T> type;
     };
 }

我正在寻找替代方案。任何建议将不胜感激。

编辑:我考虑的另一个选择是:

namespace my {
     using boost::shared_ptr;
}

然后使用my::shared_ptr<int>. 后来我会boost改成stdin namespace my。但是,我无法决定每种方法的利弊来做出决定。

4

2 回答 2

5

与 C++98 兼容的四个选项,

1)使用impl::shared_pointer<T>。并从以下位置切换:

namespace impl = boost;namespace impl = std;

2)(更优雅但风险更大)是在shared_ptr没有命名空间限定的情况下使用,然后从

using boost::shared_ptrusing std::shared_ptr.

3)(丑陋但我是首选的工业解决方案)一直使用宏。

#if DETECTC++11
#define SHARED_PTR std::shared_ptr
#else
#define SHARED_PTR boost::shared_ptr
#endif

4)结合以上3。

匿名命名空间有助于将using语句保持在文件本地,因此您可以控制每个源文件,例如:

namespace{
  using std::shared_ptr;
}

(我个人一直使用 2.)。

于 2014-04-08T06:10:31.387 回答
1

我们在项目中做了这样的事情:

#if compiler_doesnt_support_c++11
  #include <boost/shared_ptr.hpp>

  namespace std {
    using boost::shared_ptr;
  }
#elif compiler_has_c++11_in_tr1
  #include <memory>
  namespace std {
    using std::tr1::shared_ptr;
  }
#else
  #include <memory>
#endif

只需std::shared_ptr在代码中使用。

是的,它在技术上是未定义的行为(因为你不能::std像那样向命名空间添加名称),但它多年来一直没有任何问题。

于 2014-04-08T07:09:57.970 回答