如何使用具有C++ 0x功能的autoconf

the*_*mis 5 c++ autoconf c++11

autoconfshared_ptrTR1/BOOST C++ 0x模板一起使用的最佳实践是什么,以便最大限度地提高可移植性和可维护性?

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

  1. 在代码中,应该如何shared_ptr引用?
  2. 应该std::tr1::shared_ptr首选boost::shared_ptr吗?

对于第一个,代码当前正在使用预处理器条件,允许非限定引用shared_ptr,la

#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
Run Code Online (Sandbox Code Playgroud)

其次,代码使用std::tr1::over boost::来最小化对外部库的依赖性(即使库被广泛使用).

这两种解决方案是否常见?还有更好的吗?

War*_*ung 3

对示例代码的一项改进以及第一个问题的答案是使用“ template 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));
Run Code Online (Sandbox Code Playgroud)

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

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

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