如何处理不断变化的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
对于我目前正在编写的代码,我们有时需要在一些使用较旧编译器的较旧系统上进行编译(例如-我们在较旧的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_ptr
和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));
部分 回答你的问题
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/.
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 使用参数的可变大小向量格式化字符串(例如,将参数向量传递给 std::snprintf)
- 并行STL插入迭代器,例如std :: back_insert_iterator
- 用STD = C 11或其他标准编译Boost,例如Ash C 14
- 如何将标准库与C++模块一起使用?(例如:“导入 std.io”)
- 查找索引数据结构,例如`sTD :: vector`(非数组)
- Golang操纵函数中是否有一些方法,例如std :: bind在C 中
- ::在std之前使用的是什么,例如:: std :: mutex
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- C++编译器不支持C++11(例如std::unique_ptr)构建OpenWrt
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- 尝试用C++编码时,我收到一长串错误,例如"/tmp/ccloHU4h.o:dad.cpp:(.text+0x5c): undefined reference to `std::cout'"
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- 在 C++11 中是否有等效的 boost::interprocess::null_mutex(例如 std::null
- 相关功能家族的通用功能(例如std :: stoi,std :: stof,std :: stod等)
- 如何检索智能指针数组的大小?(例如std::unique_ptr<int[]>)
- 是否可以在C++中使用命名变量(例如,键和值)而不是 .first 和 .second 进行 std::map<> "for element : container" 迭代?
- 使用 std::system 将 bash(例如 ssh)转换为 C++
- 为什么不能使用 auto 作为模板类型参数(例如 std::array<auto, 5>)?
- 从函数返回constchar*的正确方法,例如,重写std::exception::what()