5

autoconf与其他 TR1/BOOST C++0x 模板结合使用shared_ptr以最大限度地提高可移植性和可维护性的最佳实践是什么?

有了autoconf我可以确定是否shared_ptr可用std::tr1::shared_ptr和/或boost::shared_ptr. 鉴于相同的功能有两个不同的名称,我有以下问题:

  1. 在代码中,应该如何shared_ptr引用?
  2. 应该std::tr1::shared_ptr优先于boost::shared_ptr?

首先,代码当前正在使用预处理器条件,允许对 的非限定引用shared_ptr,a

#if HAVE_STD_TR1_SHARED_PTR
using std::tr1::shared_ptr;
#elif HAVE_BOOST_SHARED_PTR
using boost::shared_ptr;
#else
#error "No definition for shared_ptr found"
#endif

其次,代码使用std::tr1::overboost::来最小化对外部库的依赖(即使这些库被广泛使用)。

这两种解决方案通用吗?有更好的吗?

4

1 回答 1

3

对示例代码的一个改进以及对第一个问题的回答是使用“模板 typedef ”习语:

#if HAVE_STD_TR1_SHARED_PTR
    template <class T>
    struct SharedPtr {
        typedef std::tr1::shared_ptr<T> Type;
    };
#elif HAVE_BOOST_SHARED_PTR
    template <class T>
    struct SharedPtr {
        typedef boost::shared_ptr<T> Type;
    };
#else
#   error "No definition for shared_ptr found"
#endif

// Declare a shared_ptr using our wrapper classes, saving us from having to care
// where shared_ptr comes from:
SharedPtr<int>::Type my_shared_int(new int(42));

这样做的主要问题是需要使用 ::Type 表示法。这纯粹是因为 C++ 目前无法为模板提供 typedef。您可以为模板类型实例设置 typedef ,但重要的是我们保留通用性。

至于您是否应该更喜欢 TR1 而不是 Boost,我会说是的。既然编译器附带了部分 C++0x 支持,我想说您还应该测试 std::shared_ptr 并且比其他任何一个都更喜欢它。

如果编译器的 shared_ptr 在其他地方,您可能需要第四个 typedef。我不知道这样的编译器,但我维护的一些 C++ 代码的功能类似于您所询问slist的标准 C++ 库的通用扩展,用于单链表。旧的 g++ 版本将它放在全局命名空间中,现代 g++ 将它放在特定于编译器的__gnu_cxx命名空间中,我们甚至发现了一个错误地将它放在std!

于 2010-05-30T03:45:13.457 回答