我想使用现代版本的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(否则没有问题)。
我非常感谢任何建议!
答案 0 :(得分:4)
std::result_of<>
使用TR1 result_of协议而不是decltype
- 基于);事实上,VC ++ 2010中的大部分标准库实际上并未在命名空间std
中定义,而是在命名空间std::tr1
中定义,并使用using指令拉入命名空间std
。#include
相应的标头,或者如果您的平台没有TR1支持,#include
相应的使用声明来提升实现并将它们拉入命名空间std::tr1
。答案 1 :(得分:4)
VC ++ 2010 始终以C ++ 0x模式运行,但这些类存在于std
和 std::tr1
命名空间中。您必须使用#if _MSC_VER
检测编译器,以选择要包含的标头(请参阅this answer)。
Boost.TR1库可以自动包含编译器的头文件,并使用Boost填写任何缺少的功能。这可能有所帮助。
答案 2 :(得分:2)
好吧,在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)
答案 3 :(得分:1)
不同版本的MSVC具有他们拥有的功能。没有办法打开或关闭它们。
其中一些可能同时具有某些功能的tr1和std版本。语义略有不同!