gpt4 book ai didi

c++ - 如何处理不断发展的 C++ std::namespace?例如:std::tr1::shared_ptr 对比 std::shared_ptr 对比 boost::shared_ptr 对比 boost::tr1::shared_ptr

转载 作者:可可西里 更新时间:2023-11-01 16:29:22 28 4
gpt4 key购买 nike

对于我目前正在处理的代码,我们有时需要使用较旧的编译器在一些较旧的系统上进行编译(例如,我们在较旧的 IBM BlueGene/L 上运行 sims,其支持契约(Contract)规定了一些非常旧的 C++ 编译器)。代码本身使用了 shared_ptr,最初是为使用 std::tr1::shared_ptr 而编写的。在旧的 BlueGene 机器上编译时,我很快意识到它没有 tr1::实现,所以我切换到 boost::shared_ptr。原来还有一个 boost::tr1::shared_ptr。现在代码在我们的研究小组之外得到了更广泛的使用,可移植性变得更加重要。

在大型代码库中处理这些不断演变的标准库问题的(?)最佳实践是什么?我假设在新的 C++11 标准中,shared_ptr 将不再位于 tr1 命名空间中,这增加了另一个潜力:std::shared_ptr,但我猜测对此的广泛支持还有一段路要走。如果可能的话,我想使用最新的标准,但需要保持可移植性。我应该坚持使用 boost 吗?

最佳答案

要检测 shared_ptr 所在的 namespace ,您需要类似 autoconf 的东西——这就是创建 autoconf 的原因(检测平台/编译器变体)。你可以这样做:

AC_LANG(C++)

AC_MSG_CHECKING([for std::shared_ptr])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#include <memory>]]
[[std::shared_ptr<int> have_shared_ptr;]])
], [
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [Define to 1 if you have the `std::shared_ptr' class.])
], [
AC_MSG_RESULT([no])
AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [Define to 1 if you have the `std::shared_ptr' class.])
])

重复 std::tr1::shared_ptrboost::tr1::shared_ptrboost::shared_ptr

然后您可以创建一个类似于以下内容的 shared_ptr.hpp 文件:

#include <config.h>

#if defined(HAVE_STD_SHARED_PTR)
namespace ptr = std;
#elif defined(HAVE_STD_TR1_SHARED_PTR)
namespace ptr = std::tr1;
#elif defined(HAVE_BOOST_SHARED_PTR)
namespace ptr = boost;
#elif defined(HAVE_BOOST_TR1_SHARED_PTR)
namespace ptr = boost::tr1;
#else
# error No shared_ptr found.
#endif

...然后您可以将其用作:

ptr::shared_ptr<int> pointer(new int(5));

关于c++ - 如何处理不断发展的 C++ std::namespace?例如:std::tr1::shared_ptr 对比 std::shared_ptr 对比 boost::shared_ptr 对比 boost::tr1::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7095556/

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