Qual è questo costrutto: template <int> void funcName (int i)?
Ho accidentalmente commesso un errore nella codifica di una specializzazione della funzione modello e il costrutto risultante ha superato la compilazione con VS17. (Il terzo costrutto nel codice incluso di seguito)
È un costrutto valido? Come chiamerei questa funzione?
template <class T> void tempfunc(T t)
{
cout << "Generic Template Version\n";
}
template <>
void tempfunc<int>(int i) {
cout << "Template Specialization Version\n";
}
template <int> void tempfunc(int i)
{
cout << "Coding Mistake Version\n";
}
Non sono stato in grado di chiamare il terzo costrutto.
Risposte
Sì, è un valido costrutto. È un sovraccarico del modello, basato su un parametro di modello non di tipo di tipo int.
Puoi chiamarlo così:
tempfunc<42>(42);
Si noti che le chiamate senza la sintassi del modello chiameranno comunque le versioni basate su modelli su un parametro di tipo:
tempfunc(42); // calls specialization
tempfunc(true); // calls primary
Ecco una demo
template i parametri sono di due tipi: parametri di tipo e parametri non di tipo.
Quando usi
template <class T> void tempfunc(T t) { ... }
il templateparametro è un parametro di tipo. Per utilizzare tale modello, il tipo deve essere dedotto o fornito esplicitamente.
Quando usi
template <int> void tempfunc(int i) { ... }
il templateparametro è un parametro non di tipo. Per quanto ne so, il valore di un parametro non di tipo non può essere dedotto. Deve essere fornito esplicitamente.
L'ultimo templateutilizza un parametro non di tipo. Il valore con cui può essere richiamato deve essere di tipo int. Invocazioni di esempio:
tempfunc<0>(20);
tempfunc<999>(34);