GCC中不可避免的可变模板(与CUDA一起使用)



我在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>)。(我没有检查其他情况)

最新更新