3

我在 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++ 的非 0x 方言中的可变参数模板?有没有办法获得TR1的正版C++03版本?

4

1 回答 1

3

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

此外,我不禁注意到

#pragma GCC system header

<tr1/random>您提到的标题中。GCC 将特别对待该文件,例如,不会在其中报告错误警告。我原以为在符合模式下使用扩展很容易变成错误,所以我不确定发生了什么,但至少在法律上这是一种选择。

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

于 2011-07-18T21:51:57.870 回答