Condividi tramite


Windows Runtime e modelli gestiti (Estensioni del componente C++)

I modelli consentono di definire un prototipo di finestre runtime o tipo di Common Language Runtime e quindi creare un'istanza delle variazioni di quel tipo utilizzando i parametri di tipo diverso del modello.

Tutti i runtime

È possibile creare modelli per valore o per tipi di riferimento.Per ulteriori informazioni sulla creazione di valore o tipi di riferimento, vedere Classi e struct (Estensioni del componente C++).

Per ulteriori informazioni sui modelli della classe C++ standard, vedere Modelli di classe.

finestre runtime

(Non esistono commenti della funzionalità del linguaggio che si applicano solo alle finestre runtime).

ms177213.collapse_all(it-it,VS.110).gifRequisiti

Opzione del compilatore: /ZW

Common Language Runtime

Esistono alcune limitazioni a creare modelli della classe dai tipi gestiti, che vengono illustrati i seguenti esempi di codice.

ms177213.collapse_all(it-it,VS.110).gifRequisiti

Opzione del compilatore: /clr

ms177213.collapse_all(it-it,VS.110).gifEsempi

Esempio

È possibile creare un'istanza di un tipo generico con un parametro di template tipo gestito, ma non è possibile creare un'istanza di un modello gestito con un parametro di template tipo generico.Questo perché i tipi generici vengono risolti in fase di esecuzione.Per ulteriori informazioni, vedere Generics e modelli (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
};

Esempio

Un tipo generico o una funzione non può essere annidato nel modello gestito.

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

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

Esempio

Non è possibile accedere ai modelli definiti in un assembly a cui viene fatto riferimento con sintassi del linguaggio C++/CLI, ma è possibile utilizzare la reflection.Se un modello non viene creata un'istanza, non viene generato nei metadati.Se un modello viene creata un'istanza, solo le funzioni membro a cui si fa riferimento verranno visualizzati nei metadati.

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

Esempio

È possibile modificare il modificatore gestito di classe in una specializzazione parziale o nella specializzazione esplicita di un modello di 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> {};

Vedere anche

Concetti

Estensioni componenti per le piattaforme runtime