2009-07-17 12 views
6

Quando si chiama una funzione modello, è corretto omettere il tipo dopo il nome della funzione?Omettere gli argomenti nei modelli C++

A titolo di esempio, si consideri la funzione

modello <typename T> void f (T var) {...};

è ok per chiamare semplicemente in questo modo:

int x = 5;
f (x);

oppure io avere per includere il tipo?

int x = 5;
f <int> (x);

+3

Non poteva solo provare e vedere cosa succede? Sembra abbastanza facile da testare. –

+6

@ Ed Swangren, il metodo "basta provarlo" è molto poco informativo. Nel migliore dei casi ti dice che un particolare compilatore consente la sintassi data. Non ti dice nulla sulla semantica o sulla correttezza della dichiarazione rispetto allo standard della lingua. – Trent

+0

Suppongo che avrei potuto chiarire la domanda. Come Trent ha gentilmente sottolineato, non è tanto se questo verrà compilato. Sono curioso di sapere cosa succede dietro le quinte e fatica a trovare buone informazioni là fuori! – Chris

risposta

17

Ogni volta che il compilatore può dedurre argomenti del template dagli argomenti della funzione, è corretto lasciarli fuori. Questa è anche una buona pratica, poiché renderà più semplice leggere il tuo codice.

Inoltre, è possibile lasciare solo argomenti di template della fine, non all'inizio o al centro:

template<typename T, typename U> void f(T t) {} 
template<typename T, typename U> void g(U u) {} 

int main() { 
    f<int>(5);  // NOT LEGAL 
    f<int, int>(5); // LEGAL 

    g<int>(5);  // LEGAL 
    g<int, int>(5); // LEGAL 

    return 0; 
} 
10

Non c'è niente di sbagliato nel chiamarlo con parametri di template impliciti. Il compilatore ti farà sapere se viene confuso, nel qual caso potresti dovere definire esplicitamente i parametri del template per chiamare la funzione.

+1

Questa risposta non ha nemmeno senso. Chiami sempre le funzioni in modo esplicito ... – Zifre

+1

Zifre, penso che intendesse "nel qual caso potresti dovere includere esplicitamente i parametri del modello nella chiamata di funzione". – aem

+1

Non parlo delle funzioni di chiamata in modo esplicito o implicito. Parlo della definizione esplicita dei parametri del template ... – DeusAduro