Condividi tramite


Specifiche del modello

template la dichiarazione indica un set di classi con parametri o funzioni.

template < template-parameter-list > declaration

Note

modello-parametro-elenco è un elenco delimitato da virgole di parametri di modello, che possono essere tipi (nel form classeidentificatore, typenameidentificatore, o modello < modello-parametro-elenco classe di > identificatore) o parametri non di tipo da utilizzare nel corpo del modello.La sintassi per un parametro di modello è una delle operazioni seguenti:

parameter-declaration
class identifier [ = typename ] 
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]

È possibile creare un'istanza della classe che il modello simile a come si crea un'istanza di una classe normale, ma è necessario includere gli argomenti di template tra parentesi angolari (<>).In questi argomenti di modello possono essere di qualsiasi tipo se l'elenco di argomenti di modello contiene la classe o typename parola chiave, o un valore del tipo appropriato se l'argomento è un argomento non di tipo.Non è necessaria alcuna sintassi speciale per chiamare un modello di funzione, anche se le parentesi angolari e gli argomenti di template possano essere necessari se i parametri di modello non sia possibile dedurre l'input dagli argomenti della funzione.

modello-parametro-elenco è un elenco dei parametri utilizzati dalla funzione di modello che specifica quali parti di codice seguente variano.Di seguito è riportato un esempio:

template< class T, int i > class MyStack...

in questo caso, il modello può ricevere un tipo (class T) e un parametro di costante (int i).Il modello verrà utilizzato il tipo T e l'Integer costante i sulla creazione di istanze.Nel corpo del MyStack dichiarazione di, è necessario fare riferimento a T identificatore.

Una dichiarazione stessa del modello non genera il codice; specifica una famiglia di classi o funzioni, uno o più dei quali verranno generate quando viene fatto riferimento da altro codice.

Le dichiarazioni del criterio globale, lo spazio dei nomi, o ambito della classe.Non possono essere dichiarate all'interno di una funzione.

Nell'esempio seguente viene illustrata la dichiarazione, la definizione e la creazione di istanze di un modello di classe con un parametro di tipo T e un parametro di template non di tipoi.

// template_specifications1.cpp
template <class T, int i> class TestClass 
{
public:
   char buffer[i];
   T testFunc(T* p1 );
};

template <class T, int i>
T TestClass<T,i>::testFunc(T* p1) 
{
    return *(p1++)
};

// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}

argomenti di template Non di tipo

i parametri di template Non di tipo deve essere dell'integrale, l'enumerazione, il puntatore, il riferimento, o del puntatore al tipo di membro e siano costanti in fase di compilazione.È possibile qualificare come tipi di volatile o const.I valori a virgola mobile non sono consentiti come parametri di modello.Gli oggetti di tipo classe, di struttura o di unione non sono consentiti come parametri di template non di tipo, sebbene i puntatori a tali oggetti non siano consentiti.Le matrici passate come parametri di template non di tipo vengono convertite nei puntatori.Le funzioni passate come parametri non di tipo sono considerate come puntatori a funzione.I valori letterali stringa non sono consentiti come parametri di modello.

Utilizzando typename in una dichiarazione del template

typename la parola chiave può essere utilizzata nell'elenco di parametri di modello.Le seguenti dichiarazioni di modello sono identiche:

template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...

argomenti predefiniti per i parametri di modello

I template di classe possono avere argomenti predefiniti specificati mediante il = il segno di seguita dal tipo predefinito o dal valore.I modelli di funzione non può avere argomenti predefiniti.Per ulteriori informazioni, vedere Argomenti predefiniti per i template di classe :.

template<typename Type> class allocator {};
template<typename Type, 
   typename Allocator = allocator<Type> > class stack 
{
};
stack<int> MyStack;

Riutilizzo dei parametri di modello

I parametri di modello possono inoltre essere utilizzate nell'elenco di parametri di modello.Ad esempio, il codice seguente è consentito:

// template_specifications2.cpp

class Y 
{
};
template<class T, T* pT> class X1 
{
};
template<class T1, class T2 = T1> class X2 
{
};

Y aY;

X1<Y, &aY> x1;
X2<int> x2;

int main()
{
}

modelli come parametri di modello

I parametri di modello è possibile sono modelli.Questo costrutto significa che l'argomento deve essere un modello, non una classe costruita dal modello.Nell'esempio seguente, il nome A il parametro di template per il modello un parametro di modello può essere omesso, poiché non esiste un metodo che può essere utilizzata.

// template_specifications3.cpp
#include <stdio.h>

template <class T> struct str1
{
   T t;
};

template <template<class A> class T> struct str2
{
    T<int> t;
};

int main()
{
    str2<str1> mystr2;
    mystr2.t.t = 5;
    printf_s("%d\n", mystr2.t.t);
}

x5w1yety.collapse_all(it-it,VS.110).gifOutput

5

riferimenti come parametri di modello

Visual Studio .NET 2003. ha introdotto la possibilità di utilizzare i riferimenti come parametri di template non di tipo.Questa operazione non è stata concessa nelle versioni precedenti.

// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>

extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
   S()
   {
      printf_s("ri is %d\n", ri);
   }

   ~S()
   {
      printf_s("ri is %d\n", ri);
   }
};

int i = 1;

int main()
{
   S<i> s;
   i = 0;
}

x5w1yety.collapse_all(it-it,VS.110).gifOutput

ri is 1
ri is 0

Istanze annidate del modello

La versione di Visual Studio precedenti a Visual Studio 2005 obbligatorio che lo spazio vuoto viene inserito tra gli elenchi di parametri di modello quando le istanze annidate del modello dichiarate.La seguente sintassi è consentita:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

int main() 
{
   A<B<22>>();
}

Vedere anche

Riferimenti

Parole chiave C++

Altre risorse

Modelli