2009-07-17 19 views
6

Al llamar a una función de plantilla, ¿está bien omitir el tipo después del nombre de la función?Omitir argumentos en C++ Plantillas

Como ejemplo, considere la función

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

Está bien que simplemente lo llaman así:

int x = 5;
f (x);

o do I tienen para incluir el tipo?

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

+3

no Podrías probarlo y ver lo que sucede? Parece bastante fácil de probar. –

+6

@ Ed Swangren, el método "solo pruébalo" es muy poco informativo. En el mejor de los casos, te dice que un compilador en particular permite la sintaxis dada. No le dice nada acerca de la semántica o la corrección de la declaración con respecto al estándar de idioma. – Trent

+0

Supongo que podría haber aclarado la pregunta. Como Trent amablemente señaló, no era tanto si esto compilaría. Tengo curiosidad sobre lo que está sucediendo entre bastidores y me cuesta encontrar buena información por ahí. – Chris

Respuesta

17

Siempre que el compilador pueda inferir argumentos de plantilla de los argumentos de la función, está bien dejarlos fuera. Esta también es una buena práctica, ya que hará que su código sea más fácil de leer.

Además, sólo se puede dejar de argumentos de plantilla al final, no al principio o en el medio:

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

No hay nada de malo en llamarlo con parámetros de plantilla implícitos. El compilador le informará si se confunde, en cuyo caso deberá definir explícitamente los parámetros de la plantilla para llamar a la función.

+1

Esta respuesta ni siquiera tiene sentido. Siempre llama funciones explícitamente ... – Zifre

+1

Zifre, creo que quiso decir "en cuyo caso puede que tenga que incluir explícitamente los parámetros de la plantilla en la llamada a la función". – aem

+1

No hablo de funciones de llamada explícita o implícitamente, hablo de definir explícitamente parámetros de plantilla ... – DeusAduro