Windows Runtime et modèles gérés (extensions du composant C++)
Les modèles vous permettent de définir un prototype de les fenêtres runtime ou le type du common langage runtime, puis instanciez des variations de ce type avec d'autres paramètres de type de modèle.
Tous les runtimes
Vous pouvez créer des modèles de valeur ou de type référence.Pour plus d'informations sur la création le ou les types référence, consultez Classes et structs (extensions du composant C++).
Pour plus d'informations sur les modèles de classe standard C++, consultez Modèles de classe.
fenêtres d'exécution
(Il n'y a aucune note pour cette fonctionnalité de langage qui s'appliquent uniquement aux fenêtres d'exécution.)
Configuration requise
option du compilateur : /ZW
Common Language Runtime
Il existe quelques limitations à créer des modèles de classe des types managés, qui sont affichés dans les exemples de code suivants.
Configuration requise
option du compilateur : /clr
Exemples
Exemple
il est possible d'instancier un type générique avec un paramètre de modèle de type managé, mais vous ne pouvez pas instancier un modèle managé avec un paramètre générique de modèle de type.Cela est que les types génériques sont résolus au moment de l'exécution.Pour plus d'informations, consultez Génériques et modèles (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
};
Exemple
Un type ou une fonction générique ne peut pas être imbriqué dans un type managé.
// managed_templates_2.cpp
// compile with: /clr /c
template<class T> public ref class R {
generic<class T> ref class W {}; // C2959
};
Exemple
Vous ne pouvez pas accéder aux modèles définis dans un assembly référencé avec la syntaxe du langage de C++/CLI, mais vous pouvez utiliser la réflexion.si un modèle n'est pas instancié, il n'est pas émis dans les métadonnées.Si un modèle est instancié, seules les fonctions membres référencées s'affichent dans les métadonnées.
// 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();
}
Exemple
Vous pouvez changer le modificateur managé d'une classe dans une spécialisation partielle ou une spécialisation explicite d'un modèle de classe.
// 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> {};