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

时间:2011-07-18 21:39:12

标签: c++ gcc cuda thrust

我在Linux / GCC上尝试了一些CUDA / Thrust代码,想要使用一些TR1库,当我注意到一些特殊的东西时:大多数库总是会引入tr1_impl/type_traits(4.4)或{{1} (4.6),该标题将始终包含可变参数模板,如下所示:

type_traits

但是,当我在C ++ 98或C ++ 03模式下运行GCC时,这些标题也会被使用!这怎么可行?

我遇到的实际问题是CUDA工具链无法识别C ++ 0x构造,而 template<typename _Res, typename... _ArgTypes> struct is_function<_Res(_ArgTypes...)> : public true_type { }; (CUDA前端,即将联合源代码分成主机和设备源代码的程序) )遇到可变参数模板参数时正确中止并出错。

那么...... GCC如何支持和依赖C ++的非0x方言中的可变参数模板?有没有办法获得真正的C ++ 03版本的TR1?

1 个答案:

答案 0 :(得分:3)

Welp,提供标头不需要实现。要求#include <stuff>做正确的事。这意味着如果实现决定使用标头来实现此功能,则不要求这些标头符合C ++。事实上,GCC已经支持可变参数模板作为一段时间的扩展。

此外,我不禁注意到

#pragma GCC system header
你提到的<tr1/random>标题中的

GCC will treat the file specially,例如不报告错误警告。我原本以为使用符合模式的扩展很容易变成错误,所以我不确定发生了什么,但至少在法律上它是一个选项。

还有TR1的特殊状态,它不具有约束力。在我的实现上,我可以告诉包含<type_traits>的唯一C ++ 03标头是<functional>并且它恰当地仅在C ++ 0x模式下执行(即其余时间它是有效的)通过预处理的C ++ 03文件,与<tr1/random>不同。 (虽然我没有检查其他情况。)