Se ho una funzione di modello con typename T
, in cui il compilatore può impostare il tipo di per sé, non ho scrivere il tipo in modo esplicito quando chiamo la funzione come:Chiamata alla funzione modello senza <>; inferenza di tipo
template < typename T >
T min(T v1, T v2) {
return (v1 < v2) ? v1: v2;
}
int i1 = 1, i2 = 2; int i3 = min(i1, i2); //no explicit <type>
Ma se devo un modello di funzione con due nomi dei tipi differenti come:
template < typename TOut, typename TIn >
TOut round(TIn v) {
return (TOut)(v + 0.5);
}
double d = 1.54;
int i = round<int>(d); //explicit <int>
E 'vero che devo sempre specificare almeno 1 typename? Presumo che il motivo sia dovuto al fatto che C++ non è in grado di distinguere le funzioni tra diversi tipi di ritorno.
Ma se io uso una funzione vuoto e consegna un riferimento, ancora una volta non devo specificare esplicitamente il typename ritorno:
template < typename TOut, typename TIn >
void round(TOut & vret, TIn vin) {
vret = (TOut)(vin + 0.5);
}
double d = 1.54;
int i; round(i, d); //no explicit <int>
Qualora la conclusione essere quello di evitare funzioni con ritorno e più preferiscono void
funzioni che restituiscono via un riferimento quando si scrivono i modelli? O c'è la possibilità di evitare di scrivere esplicitamente il tipo di reso? Qualcosa come "tipo di inferenza" per i modelli. "Inferenza del tipo" è possibile in C++ 0x?
Il casting tra tipi rende l'idea di inferenza del tipo poco pratica, quindi non è possibile eseguire un overload sui tipi restituiti e deve specificarlo quando si tratta di un parametro del modello. – Francesco
Si potrebbe voler lavorare sul proprio algoritmo di arrotondamento. Cosa dovrebbe uscire -1.54 come? E: cosa succede se si desidera ottenere un valore ** doppio ** arrotondato? – UncleBens