pero no puedo hacerme a la sintaxis. Especialmente la parte T (&) [size]
...
Esa parte es una referencia a una matriz. Está el "right-left rule" para descifrar cualquier declaración de C y C++ .
Dado que las plantillas de función deducen tipos de argumento de plantilla de los argumentos de funciones proporcionados, lo que hace esta plantilla de funciones es deducir el tipo y el recuento de elementos de una matriz y devolver el recuento.
Las funciones no pueden aceptar tipos de matriz por valor, sino solo por puntero o referencia. La referencia se utiliza para evitar la conversión implícita de una matriz para el puntero a su primer elemento (aka, matriz de desintegración):
void foo(int*);
int x[10];
int* p = x; // array decay
foo(x); // array decay again
matriz de decaimiento destruye el tipo original de la matriz y por lo tanto el tamaño de la misma se pierde .
Tenga en cuenta que, dado que es una llamada a función en C++ 03, el valor de retorno no es una constante de tiempo de compilación (es decir, el valor de retorno no se puede usar como argumento de plantilla). En C++ 11 la función puede ser marcado con constexpr
para devolver una constante de tiempo de compilación:
template<typename T, size_t size>
constexpr size_t siz(T(&)[size]) { return size; }
Para obtener el elemento de la matriz cuenta como una constante de tiempo de compilación en C++ 03 una forma ligeramente diferente puede ser utilizado:
template<class T, size_t size>
char(&siz(T(&)[size]))[size]; // no definition required
int main()
{
int x[10];
cout << sizeof siz(x) << '\n';
double y[sizeof siz(x)]; // use as a compile time constant 10
}
En lo anterior se declara una plantilla de función con el mismo argumento-reference-a un-array, pero con el tipo de valor de retorno de char(&)[size]
(aquí es donde la "regla de izquierda-derecha" se puede apreciar) . Tenga en cuenta que la llamada a la función nunca ocurre en el tiempo de ejecución, por eso la definición de la plantilla de función siz
es innecesaria. sizeof siz(x)
es básicamente decir "cuál sería el tamaño del valor de retorno si siz(x)
se llamaran".
la manera antigua C/C++ de conseguir el contador de elementos de una matriz como una constante de tiempo de compilación es:
#define SIZ(arr) (sizeof(arr)/sizeof(*(arr)))
posible duplicado de [¿Por qué la "referencia a la matriz" se define de manera tan confusa en C++?] (Http://stackoverflow.com/questions/6456253/why-is-reference-to-array-defined-in- such-confusing-way-in-c) – sharptooth
no es exactamente un duplicado –
Es posible que desee utilizar una plantilla de alias y escribir 'alias &' que puede ser más fácil de leer. –