Melhor obter o tamanho do array em C ++

Já aconteceu de escrever algo assim?

int arr[] = {1, 2, 3, 4, 5};
some_function
( arr, sizeof(arr)/sizeof(arr[0]) );

Aqui, o tamanho do array é detectado pelo compilador porque ele possui uma lista de valores em sua inicialização. Mas some_functionquer saber seu tamanho, então o obtemos dividindo o tamanho do array pelo tamanho de seus elementos. Bastante longo.

Se for C ++, não C, podemos usar o poder dos modelos neste caso:

template<size_t SIZE, class T> inline size_t array_size(T (&arr)[SIZE]) {
return SIZE;
}

Outro recurso do C ++ também é usado aqui: referência de array. Quando uma função tem um argumento int (&a)[10], significa que ela só aceitará intarrays de tamanho 10. Mas aqui o tipo Te o tamanho SIZEsão parâmetros de modelo, então temos o processo inverso: ao invés de checar dado array com estes parâmetros Te SIZE(como eles são desconhecidos ), o compilador infere esses parâmetros de um determinado argumento. Dado tal array_sizedefinido, a chamada para some_functionpode ser reescrita assim:

int arr[] = {1, 2, 3, 4, 5};
some_function
( arr, array_size(arr) );

Nesse caso, ao compilar a chamada para array_size, o compilador estima que Tdeve ser inte SIZEdeve ser 5, pois é possível passar arrapenas para . Na medida em que e forem inferidos de forma inequívoca, podem ser omitidos.array_size<5, int>TSIZE<5, int>

Finalmente, você vê que é muito mais curto e mais claro (mais importante) do que a sizeofvariante!