我们正在编写一个将自身保存在.hpp文件中的日志库。我们希望包括<tr1/unordered_map>
(如果编译器支持TR1)或标准<map>
。如果tr1可用,是否有标准的编译时检查方式?
我认为与“__cplusplus
”定义符号的存在方式相同,可能已经定义了“__cxx__tr1
”或类似的东西。我在TR1的草稿中没有看到,所以我认为它不存在,但我想先问一下以防万一。
请注意,如果这些定义不存在,那么将它们包含在提案本身中并不是一个坏主意。
答案 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
是什么类型的?