2011-07-24 10 views
6

estoy leyendo C++ plantillas guía completa y me encontré con este no-tipo de código de los parámetros de plantilla de función (He añadido el main() y otras partes, excepto la definición de función y de llamada):de tipo no Parámetros

#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; 
} 

No entendí después de leer el libro ¿por qué necesitamos encasillar la llamada a la función?

EDIT: Explicación del libro:

complemento es una plantilla de función y plantillas de función se consideran para nombrar un conjunto de funciones sobrecargadas (incluso si el conjunto tiene sólo un miembro). Sin embargo, de acuerdo con el estándar actual, los conjuntos de funciones sobrecargadas no se pueden usar para la deducción del parámetro de la plantilla. Por lo tanto, tienen que desechar el tipo exacto del argumento de plantilla de función: ...

Compilador: g ++ 4.5.1 en Ubuntu 10.10

Respuesta

6

En sentido estricto, no se podía hacer referencia a la especialización de una plantilla de función simplemente dando una lista de argumentos de plantilla. Siempre tenía que tener un tipo de destino alrededor (como, un tipo de parámetro de función al que pasa, o un tipo de conversión al que se lanza, o un tipo de variable que le asigna).

Ese fue el caso incluso si el tipo de destino es completamente libre de los parámetros de plantilla, por ejemplo

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 
} 

El comité added rules que fueron adoptadas en C++ 0x y por los compiladores populares en su C++ 03 modo que hizo posible omitir un tipo de objetivo si proporciona una lista de argumentos de plantilla completa que proporciona tipos para todos los parámetros de plantilla, junto con todos los argumentos de plantilla predeterminados.

Cuestiones relacionadas