Partager via


Windows Runtime et modèles gérés (C++/CLI and C++/CX)

Les modèles permettent de définir le prototype d’un type Windows Runtime ou common language runtime, puis instancient les variantes de ce type à l’aide des différents paramètres de type de modèle.

Tous les runtimes

Vous pouvez créer des modèles à partir des types valeur ou référence. Pour plus d’informations sur les types référence ou valeur, consultez Classes et structs.

Pour plus d’informations sur les modèles de classe C++ standard, consultez Modèles de classe.

Windows Runtime

(Aucune note de cette fonctionnalité de langage ne s’applique qu’au Windows Runtime.)

Spécifications

Option du compilateur : /ZW

Common Language Runtime

La création de modèles de classe à partir de types managés comporte des limitations, présentées dans les exemples de code suivants.

Spécifications

Option du compilateur : /clr

Exemples

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 de modèle de type générique. C’est parce que les types génériques sont résolus au moment du runtime. Pour plus d’informations, consultez Génériques et modèles (C++/CLI).

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

Un type ou une fonction générique ne peut pas être imbriqué dans un modèle managé.

// managed_templates_2.cpp
// compile with: /clr /c

template<class T> public ref class R {
   generic<class T> ref class W {};   // C2959
};

Vous ne pouvez pas accéder aux modèles définis dans un assembly référencé avec une syntaxe de langage 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();
}

Vous pouvez modifier 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> {};

Voir aussi

Extensions de composants pour .NET et UWP