如何在编译时检查TR1?

时间:2009-04-07 07:19:34

标签: c++ dictionary unordered-map tr1

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

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

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

5 个答案:

答案 0 :(得分:2)

GCC-4.3有:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

但是,这显然不是标准的。

答案 1 :(得分:2)

如果您使用任何配置工具(如autotools),您可以尝试编写如下测试:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

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

一般来说,__cplusplus宏应该为您提供标准版本号,但是没有编译器可以为您提供100%标准实现...因此编写配置宏。

不幸的是,除非你想为每个编译器编写1001 #ifdef,否则这只是检查这些事情的非常可靠的方法(增强功能)

然后:

#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

答案 2 :(得分:2)

参见ISO C ++(WG21)论文N1575。本文已从TR1中删除,没有替换。所以没有正式的方法来检测TR1。

答案 3 :(得分:1)

我处理的一个库需要使用从Boost添加到TR1的一些类,如果可用则更喜欢TR1。解决方案(基于Unix的库)是将检查推送到配置脚本中。

所以换句话说,不,没有,我知道的便携式。也就是说,如果你在Unix上,配置脚本检查工作就足够了。

答案 4 :(得分:0)

假设有人正在使用VS2010,或者任何有TR1可用的套件,如果有人会这样做会发生什么

#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;

uMap是什么类型的?