次の方法で共有


Visual C++ のジェネリックの概要

ジェネリックは、共通言語ランタイムによってサポートされるパラメーター化された型です。パラメーター化された型はジェネリックを使用するときに指定された不明な型パラメーターで定義されている型です。

理由ジェネリックか。

C++ サポート テンプレートとテンプレートと型指定されたコレクション クラスを作成するジェネリックのサポート、パラメーター化された型の両方。ただし、テンプレートは、コンパイル時のパラメーター化を提供します。含むアセンブリを参照し、テンプレート定義テンプレートの特化新しいを作成できません。コンパイルされて、特化したテンプレートは、他のクラスまたはメソッドのように見えます。これに対し、ジェネリックは、パラメーター化された型であるためにランタイムによって認識されるパラメーター化された型として MSIL に表示されます; 含むアセンブリをジェネリック型参照するソース・コードは、ジェネリック型に特化を作成できます。Visual C++ のテンプレートとジェネリック比較の詳細については、 " " を参照してください ジェネリックとテンプレート (Visual C++)

ジェネリック関数と型

マネージ型であれば、クラス型はジェネリック場合があります。この例は List クラスである場合があります。リストのオブジェクト型は、型パラメーターです。オブジェクトの多くの異なる型の List のクラスが必要な場合は、ジェネリックが項目の種類として System::オブジェクト を受け取る List を使用する場合があります。前に、ただし、オブジェクト (間違った型のなどのオブジェクト)リストで使用できるようになります。このようなリストは、型指定されていないコレクション クラスと呼ばれます。精々、ランタイムで型をチェックして例外がスローされる可能性があります。または、最初のアセンブリにコンパイルされる一般的な品質を失うテンプレートを使用する場合があります。アセンブリのコンシューマーは、テンプレートに独自の特化を作成できませんでした。ジェネリック コレクションは、が型指定されたコレクションに受け入れるようにデザインされていない型を配置する場合は、販売コンパイル時のエラーを生成する読み取りList<double> 組のリスト (「」)を List<int> (「int list として」)型指定されたコレクション クラスを作成することもできます。また、これらの型は、コンパイルされた後、一般的に残ります。

ジェネリック クラスの構文については.A の新しい名前空間、 System.Collections.Genericジェネリック クラス (C++/CLI)検出される可能性がある一連の Dictionary<TKey, TValue>List<T>LinkedList<T>を含むパラメーター化されたコレクション型について説明します。詳細については、「.NET Framework クラス ライブラリのジェネリック (C# プログラミング ガイド)」を参照してください。

インスタンスと静的クラス メンバーの両方、関数デリゲートとグローバル関数は、ジェネリック場合があります。ジェネリック関数は、関数のパラメーターが不明な型であるか、関数自体がジェネリック型を使用している必要があります。多くの場合 System::オブジェクト が不明なオブジェクト型のパラメーターとして以前使用できる場所でジェネリック型パラメーターはより多くのタイプ セーフなコードに対してことができ、割り当てます代わりに使用されます。関数が用にデザインされていないと型を渡すと、コンパイル時のエラーとしてフラグが設定されます。関数パラメーターとして System::オブジェクト を使用して、関数で処理できるように意図していないオブジェクトの不注意渡すことは、関数本体の特定の型に不明なオブジェクト型をキャストして InvalidCastException の可能性を示しています検出されていない。ジェネリックによって、関数にオブジェクトを渡すとしているコードにより型の競合が発生する正しい型を持つための関数本体は保証されません。

同じ利点は、ジェネリックでビルドされたコレクション クラスに適用されます。以前コレクション クラスは、コレクションに要素を格納するために System::オブジェクト を使用します。コレクションが用にデザインされていないと、型のオブジェクトの挿入はコンパイル時に、オブジェクトが挿入された場合でも、フラグが立てられないします。通常、他の型へのオブジェクトはコレクションにアクセスしたときにキャストします。キャストの失敗が予期しない型検出された場合だけです。ジェネリックはコンパイル時に (または暗黙的に変換してからジェネリック コレクション型パラメーターと一致しない型を挿入するコードの検出に、この問題を解決します。

構文については、 " " を参照してください ジェネリック関数 (C++/CLI)

ジェネリックで使用される用語

c570k3f3.collapse_all(ja-jp,VS.110).gif型パラメーター。

ジェネリック宣言は 型パラメーターと呼ばれる一つ以上の不明な型が含まれています。型パラメーターは、ジェネリック宣言の本体で型を意味する名前が付けられます。型パラメーターは、ジェネリック宣言の本体内の型として使用されます。リスト <T> の一般的な宣言では、型パラメーター T が含まれます。

c570k3f3.collapse_all(ja-jp,VS.110).gif型の引数

型引数、 ジェネリックで特定の型に特化するか、または入力すると型パラメーターの代わりに使用される実際の型です。たとえば、 int は List<int>の型引数です。値型、およびハンドルの型はジェネリック型引数として使用される唯一の型です。

c570k3f3.collapse_all(ja-jp,VS.110).gif構築型

ジェネリック型から構築された型は、 構築型と呼ばれます。完全に List<T> などの、指定されていない型は、 オープン構築型(); 完全に List<double>, などの、指定した型は クローズ構築型 または 特殊な型です。オープン構築型は他のジェネリック型またはジェネリック メソッドの定義で使用され、し外側のジェネリック自体が指定されなければ完全に指定されていないそうでない場合があります。たとえば、ジェネリックの基本クラスとしてオープン構築型の使用です:

// generics_overview.cpp

// compile with: /clr /c

generic <typename T>

ref class List {};

generic <typename T>

ref class Queue : public List<T> {};

c570k3f3.collapse_all(ja-jp,VS.110).gif制約

制約は、型パラメーターとして使用できる型の制限です。たとえば、特定のジェネリック クラスは指定されたクラスから継承する、または実行します指定されたインターフェイスを格納するクラスのみを受け入れる。詳細については、「ジェネリック型パラメーターの制約 (C++/CLI)」を参照してください。

参照型と値型

ハンドルは入力し、値型は型引数として使用される場合があります。いずれかの型が使用される可能性がある一般的な定義では、構文は、参照型の場合です。型パラメーターの種類のメンバーにアクセスする場合などに、最終的に使用される型が参照型または値型か、 -> 演算子が使用されています。値型を型引数として使用すると、ランタイムは値型を囲むことは直接値型を使用するコードを生成します。

参照型をジェネリック型引数として使用する場合は、ハンドルの構文を使用します。値型をジェネリック型引数として使用する場合は、型の名前を直接使用します。

// generics_overview_2.cpp

// compile with: /clr

generic <typename T>

ref class GenericType {};

ref class ReferenceType {};

value struct ValueType {};

int main() {

GenericType<ReferenceType^> x;

GenericType<ValueType> y;

}

型パラメーター。

ジェネリック クラスの型パラメーターは他の ID と同様に扱われます。ただし、型がわからないため、使用には制限があります。たとえば、メンバーを使用できず、これらのメンバーをサポートすると型パラメーターが不明な場合型パラメーターのメソッドが用意されています。つまり、型パラメーターによってメンバーにアクセスするには、型パラメーターの制約リストにメンバーを含む型を追加します。

// generics_overview_3.cpp

// compile with: /clr

interface class I {
   void f1();
   void f2();
};

ref struct R : public I {
   virtual void f1() {}
   virtual void f2() {} 
   virtual void f3() {} 
};

generic <typename T>
where T : I
void f(T t) {
   t->f1();
   t->f2();
   safe_cast<R^>(t)->f3();
}

int main() {
   f(gcnew R());
}

これらの制限は演算子にも適用されます。制約のないジェネリック型パラメーターは型がこれらの演算子をサポートしない型パラメーターの 2 個のインスタンスを比較するために == と != の演算子を使用しない場合があります。これらのチェックが無効なメンバーの使用を確認できない場合の場合、がジェネリック制約を満たすクラスとのランタイムに特化したことがあるため、ジェネリックに、テンプレートに必要です。

型パラメーターの既定のインスタンスは、 () の演算子を使用して作成できます。次に例を示します。

T t = T();

T がジェネリック クラスまたはジェネリック メソッド定義の型パラメーターである場合は、変数を既定値に初期化します。T が ref クラスの場合は、 null ポインターです。; T クラスが値の場合、オブジェクトはゼロに初期化されます。これは、既定 の初期化子と呼ばれます。

参照

その他の技術情報

ジェネリック (C++ コンポーネント拡張)