在GCC和MSVC中使用TR1库
我想使用随现代版本的GCC和MSVC一起发布的TR1库,但有一些细微的差别:在GCC中,我不得不说
#include <tr1/memory>
std::tr1::shared_ptr<int> X;
而在MSVC我不得不说
#include <memory>
std::shared_ptr<int> X;
我有两个问题:1)MSVC是否自动在C ++ 0x模式下工作(相当于GCC的std = c ++ 0x),还是默认情况下工作在C ++ 98/03模式下? 2)我如何统一包含和命名空间? 我正在考虑一个类似“INCLUDE_TR1(内存)”或类似的预处理宏。
为了澄清,我想使用传统的标准C ++ 98/03; 不是C ++ 0x(否则不会有问题)。
我会非常感激任何建议!
std::result_of<>
使用TR1 result_of协议,而不是基于decltype
的); 事实上,VC ++ 2010中的大部分标准库实际上并没有在命名空间std
定义,而是在名称空间std::tr1
定义,并且使用using指令将其拉入命名空间std
。 #include
包括适当的头文件,或者如果你的平台没有TR1支持, #include
包括相应的Boost实现,并使用声明将它们拖到命名空间std::tr1
。 VC ++ 2010 始终以C ++ 0x模式运行,但类存在于std
和std::tr1
命名空间中。 您必须使用#if _MSC_VER
来检测编译器以选择要包含的头(请参阅此答案)。
Boost.TR1库可以自动包含您的编译器的头文件,并使用Boost来填充任何缺失的功能。 它可能有帮助。
好的,在Boost.TR1出现几个不一致和不可克服的问题后,尤其是在尝试使用GCC的本地TR1库时,我决定完全抛弃Boost并使用一个小的#define解决方法。 这是我的“tr1.h”:
#ifndef _TR1_INCLUDE_H
#define _TR1_INCLUDE_H
/** Usage: #include TR1INCLUDE(unordered_map)
**
** Configuration: Define HAVE_TR1_SUBDIR if you need #include <tr1/unordered_map>; otherwise we take #include <unordered_map>.
**
**/
#define QUOTE(arg) <arg>
#ifdef HAVE_TR1_SUBDIR
# define TR1IFY(arg) tr1/arg
#else
# define TR1IFY(arg) arg
#endif
#define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))
#endif
现在我可以像这样编写我的程序:
#include "tr1.h"
#include TR1INCLUDE(unordered_map)
链接地址: http://www.djcxy.com/p/86359.html
上一篇: Using TR1 libraries in GCC and MSVC
下一篇: What is "ANSI C++"?