对于我当前正在处理的代码,我们有时需要在一些旧系统上使用旧编译器进行编译(例如,我们在旧 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(使用前将#替换为@)