Standard
ECMA-372
C++/CLI 言語仕様書
西暦2005年12月 初版
ナビゲーション リンクのスキップ

30.テンプレート

 テンプレートの構文は、CLI クラス型も含め全ての型に対して同じです。 CLI クラス型のテンプレートは部分特殊化、完全特殊化を可能とし、(標準C++で定義された全ての型と定数表現を条件とする)任意の型の非型パラメータを標準C++で仕様規定された同じ構文で、使うことができます。
 テンプレートはコンパイル時に完全にコンパイル、解決され、それ自身のアセンブリ中に配置されます。
 アセンブリ中では、テンプレートはアセンブリ中で使用されたテンプレート型のみが暗黙のうちにインスタンス化されています。

 メタデータは §34.17 を参照のこと。

30.1 テンプレート宣言

 標準 C++ によって許されたテンプレート宣言に加えて、C++/CLI は ref クラス・テンプレート、値クラス・テンプレート、そして、インターフェイス・テンプレートを許しています。 デリゲート・テンプレートと、列挙型テンプレートは不正です。
 List<List<int>> といったコンストラクトを許すために、>> は一つではなく、二つのトークンであると扱うので、標準 C++(SS14/1)の構文ルールのすぐ後に次のような文章を挿入します。
[注意:template-declaration(テンプレート宣言)template-parameter-list(テンプレート・パラメータ・リスト)に続くトークン > は二つの連続したトークン > によってトークン >> を置き換えられたプロダクトかもしれません。]
 標準C++(SS14.1/1)の構文ルールのすぐ後ろに以下の文章を挿入します。
type-parameter(型パラメータ)template-parameter-list(テンプレート・パラメータ・リスト)に続くトークン > は二つの連続したトークン > によってトークン >> を置き換えられたプロダクトかもしれません。]

30.2 テンプレート特殊化

 List<List<int>> といったコンストラクトを許すために、>> は一つではなく、二つのトークンであると扱うので、標準 C++(SS14.2/3)の最後の規範センテンスの後の例の前に次のような文章を挿入します。
同様に、最初のネストでない >> は別個の > トークンではなく、二つの連続したトークンとして扱います。その最初のものは template-argument-list の終わりとして取り、template-idを完成させます。[注意:二番目の > トークンはこの置き換えルールによって近接するtemplate-idコンストラクトを完了するものかもしれず、もしくは、別のコンストラクトの部分かもしれない。(例えば、キャスト)]
 SS14.2/3 の例は次のものに置き換えられます。
template<int i> class X {  /* ... */ };
X< 1>2 > x1;    // 構文エラー
X<(1>2)> x2;    // おっけー

template<class T> class Y { /* ... */ };
Y<X<1>> x3;       // おっけー、"Y<X<1> > x3;"と同等。
Y<X<6>>1>> x4;    // 構文エラー。代わりに "Y<X<(6>>1)>> x4;"と書くこと。

30.3 属性

 テンプレートを含むクラスは属性を、その属性をテンプレート・パラメータ・リストの後ろ、class-key(クラス・キー)の前に記述することで、持つことができます。テンプレート・パラメータは属性として認められており、また、属性の引数としても認められています。[例:
template<typename T>
[attributes]
ref class R {  };

 テンプレート中の関数は属性を持つことができ、それらの属性はテンプレート・パラメータ・リストの後ろ、関数宣言の前に記述します。[例:
template<typename T>
[attributes]
void f(const &T t) { /* ... */ };


30.4 型推論(Type deduction)

 %, ^, &, * の間に優先順序はありません。
 nullptr リテラルのテンプレート型推論はできません。

30.4.1 テンプレート引数推論

 System::String^ に <narrow-string-literal-type> と <wide-string-literal-type> の変換を適用するために、標準 C++(SS14.8.2.1/2)中のリストは次のものを含むよう拡張されます。
――もし、A が <narrow-string-literal-type> であれば、推論された型 P は "const char n個の配列"です。
――もし、A が <wide-string-literal-type> であれば、推論された型 P は"const wchar_t n個の配列"です。

文責:翻訳 => ヽ(゚∀。)ノうぇね