the*_*mis 5 c++ autoconf c++11
autoconf与shared_ptrTR1/BOOST C++ 0x模板一起使用的最佳实践是什么,以便最大限度地提高可移植性和可维护性?
随着autoconf我能确定是否shared_ptr可以作为std::tr1::shared_ptr和/或boost::shared_ptr.鉴于相同的功能有两个不同的名称,我有以下问题:
shared_ptr引用? 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::来最小化对外部库的依赖性(即使库被广泛使用).
这两种解决方案是否常见?还有更好的吗?
对示例代码的一项改进以及第一个问题的答案是使用“ 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!
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |