Generics e modelli (Visual C++)
Generics e modelli sono entrambe le funzionalità del linguaggio che forniscono il supporto di tipi con parametri.Tuttavia, sono diverse e dispongono di diversi utilizzi.In questo argomento viene fornita una panoramica delle numerose differenze.
Per ulteriori informazioni, vedere Windows Runtime e modelli gestiti (Estensioni del componente C++) e Panoramica dei modelli.
Confrontare i modelli e i generics
Differenze principali tra generics e i modelli C++:
I generics è generico fino a sostituire i tipi appositamente in fase di esecuzione.I modelli sono specializzati in fase di compilazione in modo che non sono ancora tipi con parametri in fase di esecuzione
Common Language Runtime in particolare supporta i generics in MSIL.Poiché il runtime conosce i generics, i tipi specifici possono essere sostituiti dai tipi generici quando fa riferimento a un assembly che contiene un tipo generico.I modelli, invece, risolvono in tipi comuni in fase di compilazione e i tipi risultante non possono essere specializzati in altri assembly.
I generics specializzato in due assembly diversi con gli stessi argomenti di tipo è lo stesso tipo.I modelli specializzati in due assembly diversi con gli stessi argomenti di tipo sono considerati dal runtime come due tipi diversi.
I generics viene generato come singola porzione di codice eseguibile utilizzato per tutti gli argomenti di tipo riferimento (ciò non accade per i tipi di valore, che presentano un'implementazione univoca per il tipo di valore).Il compilatore JIT è ai generics e può ottimizzare il codice per il riferimento o i tipi di valore utilizzato come argomenti di tipo.I modelli generano il codice di runtime distinto per ogni specializzazione.
I generics non consente parametri di template non di tipo, come template <int i> C {}.I modelli consentano una.
I generics non consente la specializzazione esplicita (ovvero un'implementazione personalizzata di un modello per un tipo specifico).i modelli fanno.
I generics non consente la specializzazione parziale (un'implementazione personalizzata per un sottoinsieme degli argomenti di tipo.i modelli fanno.
I generics non consente il parametro di tipo da utilizzare come classe base per il tipo generico.i modelli fanno.
Parametri di modello-modello di supporto modelli (ad esempiotemplate<template<class T> class X> class MyClass), ma i generics contrario.
Combinazione dei modelli e dei generics
- La differenza di base nei generics ha implicazioni per compilare applicazioni che combinano i modelli e i generics.Ad esempio, si supponga che sia una classe modello per cui si desidera creare un wrapper generico per esporre il modello in altri linguaggi come generico.Non è possibile effettuare renderlo il tipo generico a un parametro di tipo che quindi passa comunque al modello, poiché il modello deve disporre il parametro di tipo in fase di compilazione, ma l'oggetto generico non risolverà il parametro di tipo fino alla fase di esecuzione.L'annidamento di un modello in un oggetto generico non verrà eseguito uno perché non è possibile espandere i modelli in fase di compilazione per i tipi generici arbitrari cui potrebbe essere stata creata un'istanza in fase di esecuzione.
Esempio
Descrizione
In l ' esempio seguente viene illustrato insieme un esempio semplice dei modelli e dei generics utilizzando.In questo esempio, la classe modello passa il parametro al tipo generico.Il contrario non è possibile.
Questo linguaggio potrebbe essere utilizzato quando si desidera compilare su un'api generico esistente con il codice del modello che è locale a un assembly di Visual C++, o se è necessario aggiungere un ulteriore livello di parametrizzazione a un tipo generico, usufruire di determinate funzionalità dei modelli non supportati dai generics.
Codice
// templates_and_generics.cpp
// compile with: /clr
using namespace System;
generic <class ItemType>
ref class MyGeneric {
ItemType m_item;
public:
MyGeneric(ItemType item) : m_item(item) {}
void F() {
Console::WriteLine("F");
}
};
template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;
public:
MyRef(T t) {
ig = gcnew MyGeneric<T>(t);
ig->F();
}
};
int main() {
// instantiate the template
MyRef<int>^ mref = gcnew MyRef<int>(11);
}
Output
F