2013-03-09 15 views
11

consideri una semplice funzione di modello:C'è un motivo per affermare esplicitamente il tipo di modello?

template <typename T> 
void FunctionTemplate(T t){ 
} 

void MyFunction(){ 
    int a; 
    FunctionTemplate(a); 
    FunctionTemplate<int>(a); 
} 

Nella prima chiamata a (FunctionTemplate(a)), il compilatore elabora il tipo che solleva la questione, v'è alcuna ragione per l'esistenza del secondo modo di chiamare FunctionTemplate (FunctionTemplate<int>(a)) o altri validi motivi per cui non è possibile utilizzare il primo metodo?

Modifica: La mia terminologia il mio essere un po 'fuori, quindi per favore modificare come richiesto.

risposta

13

Occasionalmente si vuole per specificare l'argomento del modello, anche se non si deve. Diciamo che la tua funzione prende un argomento di tipo T e tu hai un int ma vuoi che la funzione lo prenda come float. Quindi dovresti dire esplicitamente FunctionTemplate<float>(my_int).

Ci sono anche molti casi in cui il parametro del modello non può essere dedotto. Si consideri il seguente:

template <typename T> 
T FunctionTemplate() { 
    return T(); 
} 

Non importa come si chiama questo, se non si fornisce l'argomento di template, il tipo di T non può essere ricavato automaticamente. Il semplice motivo in questo caso è che il sito di chiamata non dice nulla di ciò che si aspetta che il tipo di ritorno sia.

Per la terminologia: quando non si specificano gli argomenti del modello, il modello viene implicitamente istanziato; quando si specificano gli argomenti del modello, il modello viene esplicitamente istanziato.

+0

Vorrei scegliere 'FunctionTemplate ((float) my_int)' per un modello di funzione a semplice argomento semplice. I gusti variano, però! – Ajay

9

Si supponga di voler passare la funzione a un altro metodo come parametro;

myAlgorithm(myFunction<int>); 

O supponiamo si vuole garantire una versione in virgola mobile di una funzione viene utilizzata per la velocità;

myFunction<float>(2.0); 

(dimenticando di scrivere 2.0f non è un problema ora)

+0

sftrabbit solleva anche un buon esempio nella sua risposta; quando il tipo di reso dipende dal modello, ma nessuno dei parametri. – Dave

7

Un uso sta costringendo al compilatore di utilizzare una versione specifica della funzione template:

template <typename T> 
T func(T x, T y) 
{ 
    // ... 
} 

int main() 
{ 
    int x = 10; 
    float y = 20; 

    func(x, y); //ERROR no matching function for call to 'func(int&, float&)' 

    func<float>(x, y); // OK, Uses float version of func 
} 
Problemi correlati