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

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

作为一个说明,如果不存在这些定义,它不会是一个坏主意,包括他们的建议本身。

有帮助吗?

解决方案

如果使用的是任何配置工具,如自动工具可能会尝试写入像一个测试:

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

其他提示

GCC-4.3具有:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

但是,这显然是不标准。

请参阅ISO C ++(WG21)纸 N1575 。本文已经从TR1下降,没有更换。因此,有检测TR1没有正式的办法。

一个库我处理需要使用接到升压加入到TR1一些类,如果有喜欢TR1。将该溶液(作为一个基于Unix的库)是将检查推入配置脚本。

因此,换句话说,没有,没有什么便携式,我知道的。也就是说,如果你是在Unix,配置脚本检查工作不够好。

假设一个使用VS2010,或有TR1可用的,如果一个人做,会发生什么任何套件

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

uMap的会是什么类型是什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top