如何在编译时检查TR1?

Die*_*lla 5 c++ dictionary unordered-map tr1

我们正在编写一个日志库,它将自己保存在.hpp文件中.我们想包括<tr1/unordered_map>(如果编译器支持TR1)或其他标准<map>.如果tr1可用,是否有标准的编译时检查方法?

我认为与" __cplusplus"定义符号存在的方式相同,可能已经定义了" __cxx__tr1"或类似的东西.我在TR1的草稿中没有看到,所以我认为它不存在,但我想先问一下以防万一.

需要注意的是,如果这些定义不存在,那么将它们包含在提案本身中并不是一个坏主意.

Art*_*yom 2

如果您正在使用任何配置工具(例如自动工具),您可以尝试编写如下测试:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中使用这些定义。

一般来说,__cplusplus宏应该给你标准版本号,但没有编译器给你100%标准实现......因此编写配置宏。

不幸的是,这只是检查此类事情的相当可靠的方法,除非您想为每个编译器编写 1001 #ifdef(boost 的作用)

进而:

#include "config.h"
#ifdef  HAVE_CXX0X
#  include <unordered_map>
   typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
#  include <tr1/unordered_map>
   typedef std::tr1::unordered_map<foo,bar> my_map;
#else
#  include <map>
   typedef std::map<foo,bar> my_map;
#endif
Run Code Online (Sandbox Code Playgroud)