Ordine parziale dei modelli di funzione (C++)
I modelli di funzioni più corrispondenti all'elenco di argomenti di una chiamata di funzione possono essere disponibili.C++ definisce un ordine parziale dei modelli di funzione per specificare che la funzione deve essere chiamata.L'ordine è parziale in quanto possono essere presenti alcuni modelli che sono considerati specializzati ugualmente.
Il compilatore sceglie la funzione di modello specializzata disponibile dalle possibili corrispondenze.Ad esempio, se un modello di funzione accetta un tipo te un'altra rimozione del template di funzione T* è disponibile, T* la versione sarebbe sofisticata ed è preferibile rispetto al generico t controllare la versione ogni volta che l'argomento è un tipo di puntatore, anche se entrambe sono corrispondenze consentite.
Utilizzare la seguente procedura per determinare se un candidato del template di funzione è un oggetto specializzato:
considerare due modelli di funzione, T1 e T2.
Sostituire i parametri in T1 con un tipo univoco ipotetico X.
Con l'elenco di parametri in T1, vedere se il T2 è un modello valido per tale elenco di parametri.Ignorare tutte le conversioni implicite.
Ripetere lo stesso processo con il T1 e il T2 invertiti.
Se un modello è un elenco di argomenti di modello valido per un altro modello, ma non è vero il contrario, quindi che il modello è considerato meno essere specializzato che un altro modello.Se entrambi i modelli mediante il passaggio precedente costituiscono gli argomenti validi per loro, quindi vengono considerati come specializzati ugualmente e una chiamata ambigua verifica un errore durante il tentativo di utilizzo.
Utilizzando le seguenti regole:
Una specializzazione del template per un tipo specifico è specializzata di una che accetta un argomento di tipo generico.
Un modello che accetta soltanto T* è specializzata di uno esclusivamente t, in quanto un tipo ipotetico X* è un argomento valido per un oggetto t argomento di modello, ma x non è un argomento valido per un oggetto T* argomento di modello.
const T consente di t, poiché const X è un argomento valido per un oggetto t argomento di modello, ma x non è un argomento valido per un oggetto const T argomento di modello.
const T* consente di T*, poiché const X* è un argomento valido per un oggetto T* argomento di modello, ma X* non è un argomento valido per un oggetto const T* argomento di modello.
I seguenti funzionamento di esempio in Visual C++ .NET 2003 come specificato nello standard:
// partial_ordering_of_function_templates.cpp
// compile with: /EHsc
#include <iostream>
extern "C" int printf(const char*,...);
template <class T> void f(T) {
printf_s("Less specialized function called\n");
}
template <class T> void f(T*) {
printf_s("More specialized function called\n");
}
template <class T> void f(const T*) {
printf_s("Even more specialized function for const T*\n");
}
int main() {
int i =0;
const int j = 0;
int *pi = &i;
const int *cpi = &j;
f(i); // Calls less specialized function.
f(pi); // Calls more specialized function.
f(cpi); // Calls even more specialized function.
// Without partial ordering, these calls would be ambiguous.
}
Output
Less specialized function called
More specialized function called
Even more specialized function for const T*