如何处理不断发展的 c++ std:: 命名空间?例如: std::tr1::shared_ptr 与 std::shared_ptr 与 boost::shared_ptr 与 boost::tr1::shared_ptr

2023-11-23

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

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


要检测shared_ptr所在的命名空间,您需要像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_ptr, boost::tr1::shared_ptr and boost::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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理不断发展的 c++ std:: 命名空间?例如: std::tr1::shared_ptr 与 std::shared_ptr 与 boost::shared_ptr 与 boost::tr1::shared_ptr 的相关文章

随机推荐