_Achille
Utente Èlite
- Messaggi
- 3,067
- Reazioni
- 725
- Punteggio
- 131
Forse ho sbagliato con il termine “validati”. Intendo eseguiti.??? Uno dei vantaggi dei template e' che vengono validati al tempo della compilazione. Infatti quello che fa il compilatore e' creare una funzione per ogni tipo di variabile per cui lo abbiamo utilizzato, usando method overloading. In pratica e' quello che faremmo (a mano) noi, evitando le possibilta' di sbagliare (che sono alte facendo taglia e cuci).
Il concetto dei Template e' proprio come uno dei tanti altri concetti tipico della programmazione. Da' al programmatore la possibilita' di usarlo. Sta al programmatore decidere SE usarlo, a seconda del problema e del contesto. Come in TUTTI gli altri casi. Prendi la ricorsione per esempio; e' stupenda per una limitata classe di problemi, e' orribile per altri. Lo stesso con i Template.
Prova a scrivere un Windows server usando COM. Hai due possibilita': MFC e ATL, entrambe funzionano, ma un server scritto usando ATL e' MILLE volte meglio. Il codice e' piu' piccolo e quindi piu' facile da mantenere, l'eseguibile ha dimensioni minuscole, va piu' veloce, e' piu facile da farne il debugging.
Non per nulla il concetto di Template e' stato esportato anche su C# (linguaggio molto strongly typed) con l'introduzione dei "generic"
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods
Il compilatore genera ciascuna una funzione per ciascun valore possibile in template. In questi casi mi sembra molto ridondante avere una funzione o una struttura per tutti i valori da 1 a N.
Comunque la mia domanda è sempre la stessa: in contesti non generici come la struttura Fattoriale scritta da me sopra, ma anche una altra come Fibonacci (che ha una maggiore profondità in ambito ricorsivo) perché dovrei preferire la struttura ad una funzione constexpr ricorsiva (ma anche iterativa per il fattoriale)? C'è qualcosa di nascosto? Alla fine una funzione constexpr è pur sempre chiamabile con valori non noti a compilazione ma un template no.