如何处理不断变化的c++ std::命名空间?例如:std::tr1::shared_ptr vs. std::shar

How to handle evolving c++ std:: namespace? e.g.: std::tr1::shared_ptr vs. std::shared_ptr vs. boost::shared_ptr vs. boost::tr1::shared_ptr

本文关键字:std 例如 命名空间 tr1 shared shar vs ptr c++ 处理 何处理      更新时间:2023-10-16

对于我目前正在编写的代码,我们有时需要在一些使用较旧编译器的较旧系统上进行编译(例如-我们在较旧的IBM BlueGene/L上运行sims,其支持合同规定了一些相当旧的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所在的名称空间,您需要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_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));

部分 回答你的问题

boost::tr1正是为没有tr1的标准库实现而发明的。从这里引用文档:

TR1库提供了c++ Technical Report的实现标准库扩展。此库本身不实现而不是TR1组件,它是一个薄包装器,将包含您的标准库的TR1实现(如果有的话),否则使用将包括Boost Library的等效物,并将它们导入名称空间std:: tr1

为什么不做一些特殊的编译时检查呢?种:

#if __GNUC__ > 3
     #define BOOST boost::
#else
     #define BOOST boost::tr1::
#endif
BOOST shared_ptr<...> ...

你可以在boost库中查找,它们有很多编译器/版本检测代码。

有关宏的详细信息,请参阅此问题,特别是此链接:http://predef.sourceforge.net/.

相关文章: