5

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

我在想,就像“ __cplusplus”定义符号的存在方式一样,也可以定义一个“ __cxx__tr1”或类似的东西。我在 TR1 的草稿中没有看到它,所以我认为它不存在,但我想先问一下以防万一。

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

4

5 回答 5

2

GCC-4.3 有:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

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

于 2009-04-07T07:31:58.473 回答
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%的标准实现......因此编写配置宏。

#ifdef不幸的是,除非您想为每个编译器编写 1001(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
于 2009-04-07T07:55:20.213 回答
2

请参阅 ISO C++ (WG21) 论文N1575。这篇论文已从 TR1 中删除,没有替换。所以没有官方的方法来检测TR1。

于 2009-04-07T11:38:41.470 回答
1

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

换句话说,不,我所知道的没有任何便携性。也就是说,如果你在 Unix 上,配置脚本检查工作得很好。

于 2009-04-07T07:48:53.677 回答
0

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

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

是什么类型的uMap

于 2011-03-14T15:36:33.350 回答