Esiste una differenza tra il modello di funzione e la funzione di modello.
template<class Type>
void Foo(Type tData) {...}
se volessi passare int a function template Foo, ma volevi anche che il compilatore lo istanziasse come se fosse passato un double che chiameresti:
Foo<double> ( 12 );
Che istanzia la seguente funzione modello:
void Foo(double);
Con questa sintassi speciale Foo<>()
, stai richiedendo al compilatore di istanziare la funzione Foo per il tipo che viene passato esplicitamente e chiedendo al compilatore di non dedurre l'argomento tipo per funzione.
Un modello di funzione è il corpo di una funzione tra parentesi attorno alla parola chiave template, che non è una funzione effettiva e non verrà compilata completamente dal compilatore e non è responsabile dal linker. Almeno una chiamata, per particolari tipi di dati, è necessaria per istanziarla ed essere messa in conto del compilatore e del linker. Pertanto, l'istanza del modello di funzione Foo viene istanziata come Foo (int) o Foo (doppio).
Una funzione del modello è semplicemente una "istanza di un modello di funzione", che viene prodotta quando la chiami o che viene creata un'istanza per un particolare tipo di dati. L'istanza del template funzione è in realtà una funzione valida.
Un'istanza di un template funzione (alias template-function) non è una funzione normale, sotto l'ombrello del sistema name-decoration del compilatore e del linker. Ciò significa, un'istanza di template di funzioni:
template<class T>
void Foo(T data) {...}
per l'argomento modello double, non lo è:
void Foo(double data) {...}
ma in realtà:
void Foo<double>(double x) {...}
Puoi leggere di più qui:
Termini del modello
Tutorial modello