我在Linux/GCC上尝试一些CUDA/Thrust代码,并想使用一些TR1库,当我注意到一些奇怪的事情时:大多数库总是会拉入tr1_impl/type_traits
(4.4)或仅type_traits
(4.6),并且头将始终包含可变模板,如:
template<typename _Res, typename... _ArgTypes>
struct is_function<_Res(_ArgTypes...)>
: public true_type { };
然而,当我在c++ 98或c++ 03模式下运行GCC时,也会使用这些头文件!这是怎么做到的?
我遇到的实际问题是CUDA工具链不识别c++ 0x结构,cudafe++
(CUDA前端,即将联合源代码分离为主机和设备源代码的程序)在遇到可变模板参数时正确地以错误终止。
所以…GCC如何支持和依赖c++非x方言中的可变模板?有没有办法获得真正的c++ 03版本的TR1?
好吧,实现不需要提供头文件。要求#include <stuff>
做正确的事情。所以这意味着如果一个实现决定为这个功能使用头文件,则不需要这些头文件是符合c++的。事实上,GCC支持可变模板作为扩展已经有一段时间了。
此外,我不禁注意到
#pragma GCC system header
在您提到的<tr1/random>
头中。GCC将对该文件进行特殊处理,例如不报告错误警告。我本以为在符合模式下使用扩展很容易变成错误,所以我不确定发生了什么,但至少在法律上这是一个选择。
还有TR1的特殊状态,它不具有binding。在我的实现到目前为止,我可以告诉唯一的c++ 03头,包括<type_traits>
是<functional>
,它正确地只在c++ 0x模式下这样做(即其余的时间,它是一个有效的c++ 03文件,通过预处理,不像<tr1/random>
)。(我没有检查其他情况)