Qual è questo costrutto: template <int> void funcName (int i)?

Oct 02 2020

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

6 cigien Oct 02 2020 at 02:15

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

3 RSahu Oct 02 2020 at 02:15

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);