La differenza più grande è quello che si può fare con queste due funzioni:
- La funzione template prende i suoi due limiti come parametri del modello, il che significa che devono essere noti al momento della compilazione
- Il la funzione regolare prende i suoi due limiti come parametri regolari, il che significa che puoi usare variabili per loro.
In sostanza, la seconda funzione permette di fare questo
int a, b;
cout << "Please enter two limits: ";
cin >> a >> b;
string s("quick brown fox");
bool res = byLength(s, a, b);
Questo non è possibile con la funzione di modello:
int a, b;
cout << "Please enter two limits: ";
cin >> a >> b;
string s("quick brown fox");
bool res = byLength<a,b>(s); // <<== DOES NOT COMPILE.
Se tutte le chiamate utilizzano espressioni costanti per i parametri limite, la funzione template può farti risparmiare un paio di cicli extra della CPU, perché il compilatore può ottimizzare meglio la sua ottimizzazione. È difficile immaginare una situazione in cui questi cicli aggiuntivi farebbero una differenza significativa.
Perché non usare solo il secondo esempio?
Ci sono situazioni in cui hai bisogno di una costante in fase di compilazione nella tua funzione. Ad esempio, se si desidera dichiarare un std::array<len>
sulla base di uno dei parametri, deve essere passato come parametro di template, non come un parametro regolare:
template<size_t sz>
void demo() {
std::array<sz> data;
...
}
Lo stesso non avrebbe funzionato con parametri di funzionamento regolari:
void demo(size_t sz) {
std::array<sz> data; // <<== DOES NOT COMPILE.
...
}
I modelli sono risolti a * tempo di compilazione *, gli argomenti vengono valutati in * tempo di esecuzione *. Ciò significa che gli argomenti del template devono essere costanti per poter essere risolti dal compilatore, mentre gli argomenti della funzione possono essere cose come input di utilizzo che è impossibile valutare al momento della compilazione. –
Ok, sembra che capisco la stupidità della domanda. Posso eliminarlo? –
Si chiamano differentemente: 'byLength (string)' vs 'byLength (string, min, max)'. Se questo fa la differenza per i tuoi occhi. –
rubikonx9