N
no quede "inicializar" a cualquier cosa. No es una variable. No es un objeto N
es una constante en tiempo de compilación. N
solo existe durante la compilación. El valor de N
así como el T
real se determina mediante el proceso deducción del argumento de la plantilla. Ambos T
y N
se deducen del tipo real del argumento que pasa a su función de plantilla.
En la primera llamada el tipo de argumento es int[6]
, por lo que el compilador deduce que T == int
y N == 6
, genera una función separada para eso y lo llama. Vamos a nombrar que cal_size_int_6
void cal_size_int_6(int (&a)[6])
{
std::cout << "size of array is: " << 6 << std::endl;
}
Tenga en cuenta que no hay ninguna T
y N
en esta función más. Ambos fueron reemplazados por sus valores reales deducidos en tiempo de compilación.
En la primera llamada el tipo de argumento es int[1]
, por lo que el compilador deduce que T == int
y N == 1
, genera una función separada para eso también y lo llama. Vamos a nombrar que cal_size_int_1
void cal_size_int_1(int (&a)[1])
{
std::cout << "size of array is: " << 1 << std::endl;
}
mismo aquí.
Su main
se traduce esencialmente en
int main()
{
int a[]={1,2,3,4,5,6};
int b[]={1};
cal_size_int_6(a);
cal_size_int_1(b);
}
En otras palabras, su plantilla cal_size
da a luz a dos funciones diferentes (los llamados especializaciones de la plantilla original), cada uno con diferentes valores de N
(y T
) codificados en el cuerpo. Así es como funcionan las plantillas en C++.
Ver http: // stackoverflow.com/questions/437150/can-someone-explain-this-template-code-that-gives-me-the-size-of-a-array (¿dupe?) –
"deducción de argumento de plantilla" es lo que estoy buscando. Gracias Andrey :) –