Windows ランタイムおよびマネージ テンプレート (C++ コンポーネント拡張)
テンプレートは、プロトタイプを定義するには、 Windows のランタイムまたは共通言語ランタイム型可能にし、異なるテンプレートの型パラメーターを使用して、その型のバリエーションをインスタンス化します。
すべてのランタイム
値または参照型からテンプレートを作成できます。値または参照型の作成の詳細については、 " " を参照してください クラスと構造体 (C++ コンポーネント拡張)。
標準 C++ クラス テンプレートの詳細については、 " " を参照してください クラス テンプレート。
ランタイム ウィンドウ
(実行時ウィンドウにのみ適用されるこの言語機能の解説はありません)。
要件
コンパイラ オプション: /ZW
共通言語ランタイム
次のコード例に示すマネージ型からクラス テンプレートの作成にいくつかの制限があります。
要件
コンパイラ オプション: /clr
例
例
マネージ型テンプレート パラメーターのジェネリック型のインスタンスを作成することはできますが、ジェネリック型テンプレート パラメーターのマネージ テンプレートをインスタンス化することはできません。これは、ジェネリック型がランタイムに解決されるためです。詳細については、「ジェネリックとテンプレート (Visual C++)」を参照してください。
// managed_templates.cpp
// compile with: /clr /c
generic<class T>
ref class R;
template<class T>
ref class Z {
// Instantiate a generic with a template parameter.
R<T>^ r; // OK
};
generic<class T>
ref class R {
// Cannot instantiate a template with a generic parameter.
Z<T>^ z; // C3231
};
例
ジェネリック型または関数では、マネージ テンプレートに入れ子にすることはできません。
// managed_templates_2.cpp
// compile with: /clr /c
template<class T> public ref class R {
generic<class T> ref class W {}; // C2959
};
例
C++/CLI の言語構文の参照アセンブリで定義されているテンプレートにアクセスできないリフレクションを使用できます。テンプレートのインスタンスが作成されていない場合、メタデータに出力されません。テンプレートがインスタンスを作成すると、参照されたメンバー関数だけがメタデータに表示されます。
// managed_templates_3.cpp
// compile with: /clr
// Will not appear in metadata.
template<class T> public ref class A {};
// Will appear in metadata as a specialized type.
template<class T> public ref class R {
public:
// Test is referenced, will appear in metadata
void Test() {}
// Test2 is not referenced, will not appear in metadata
void Test2() {}
};
// Will appear in metadata.
generic<class T> public ref class G { };
public ref class S { };
int main() {
R<int>^ r = gcnew R<int>;
r->Test();
}
例
クラス テンプレートの部分的な特化または明示的な特殊化のクラスのマネージ修飾子を変更できます。
// managed_templates_4.cpp
// compile with: /clr /c
// class template
// ref class
template <class T>
ref class A {};
// partial template specialization
// value type
template <class T>
value class A <T *> {};
// partial template specialization
// interface
template <class T>
interface class A<T%> {};
// explicit template specialization
// native class
template <>
class A <int> {};