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 { };

ただし、これらのヘッダーは、GCC を C++98 または C++03 モードで実行するときにも使用されます。これはどのように機能しますか?

私が実際に遭遇した問題は、CUDA ツールチェーンが C++0x 構造を認識せず、cudafe++(CUDA フロントエンド、つまりジョイント ソース コードをホスト ソース コードとデバイス ソース コードに分離するプログラム) が発生したときにエラーで正しく中止されることです。可変個引数のテンプレート パラメーター。

では、GCC は C++ の非 0x ダイアレクトでどのように variadic テンプレートをサポートし、依存できるのでしょうか? また、TR1 の正規の C++03 バージョンを入手する方法はありますか?

4

1 に答える 1

3

ヘッダーを提供するために実装は必要ありません。#include <stuff>The Right Thingを実行する必要があります。つまり、実装がこの機能にヘッダーを使用することを決定した場合、それらのヘッダーが C++ に準拠している必要はありません実際、GCC はかなり長い間、可変個引数テンプレートを拡張機能としてサポートしてきました。

さらに、思わず気づけてしまう

#pragma GCC system header

あなたが言及する<tr1/random>ヘッダーに。GCC はファイルを特別に扱い、たとえばエラー警告を報告しません。準拠モードで拡張機能を使用すると簡単にエラーになると思っていたので、何が起こっているのかわかりませんが、少なくとも合法的にはオプションです。

TR1の特別なステータスもありますが、拘束力はありません。私の実装では、インクルードされている唯一の C++03 ヘッダーは<type_traits>であり<functional>、それは C++0x モードでのみ適切に行われます (つまり、残りの時間は前処理を介した有効な C++03 ファイルであり、とは異なります<tr1/random>) 。 . (その他のケースは確認していません。)

于 2011-07-18T21:51:57.870 に答える