2011-07-24 17 views
6

sto leggendo ++ Modelli C Guida completa e sono imbattuto in questo non-tipo di codice parametri di modello di funzione (ho aggiunto il main() e le altre parti, tranne la definizione della funzione e call):non-tipo di modello parametri di funzione

#include <vector> 
#include <algorithm> 
#include <iostream> 

template <typename T, int value> 
T add (T const & element){ 
    return element + value; 
} 

int main() { 
    int a[] = {1,2,3,4}; 
    int length = sizeof (a)/sizeof (*a); 
    int b[length]; 
    std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why? 
    std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; }); 
    return 0; 
} 

Non ho capito dopo aver letto dal libro perché abbiamo bisogno di digitare la chiamata di funzione?

EDIT: Explaination dal libro:

aggiuntivo è un modello di funzione, ed i modelli di funzione sono considerati solo per citarne un insieme di funzioni sovraccaricate (anche se l'insieme ha un solo membro). Tuttavia, secondo lo standard corrente, non è possibile utilizzare serie di funzioni sovraccaricate per la deduzione dei parametri del template. Quindi, si deve lanciare per il tipo esatto dell'argomento funzione di modello: ...

Compiler: g ++ 4.5.1 su Ubuntu 10.10

risposta

6

A rigor di termini, non si poteva fare riferimento alla specializzazione dei un modello di funzione semplicemente dando un elenco di argomenti del modello. Devi sempre avere un tipo di target intorno (tipo, un tipo di parametro di funzione che passi, o un tipo di cast su cui hai eseguito il cast, o un tipo di variabile a cui assegni).

che era il caso, anche se il tipo di destinazione è completamente privo di parametri di modello, ad esempio

template<typename T> void f() { } 
template<typename T> void g(T) { } 

int main() { 
    g(f<int>); // not strictly valid in C++03 
    g((void(*)())f<int>); // valid in C++03 
} 

Il comitato added rules che sono state adottate in C++ 0x e dai compilatori popolari nella loro C++ 03 modalità che consentiva di omettere un tipo di destinazione se si fornisce un elenco completo di argomenti del modello che fornisce tipi per tutti i parametri del modello, insieme a tutti gli argomenti del modello predefinito.

Problemi correlati