gpt4 book ai didi

c++ - 如何使用具有 C++0x 特性的 autoconf

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:02 26 4
gpt4 key购买 nike

结合使用 autoconf 的最佳实践是什么使用 shared_ptr 和其他 TR1/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 的非限定引用,a 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

其次,代码使用 std::tr1:: 而不是 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));

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

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

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

关于c++ - 如何使用具有 C++0x 特性的 autoconf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com