我在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?
答案 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>
不同。 (虽然我没有检查其他情况。)