C'est exact, comme il utilise metaprogramming comme ceci:
template <typename T, std::size_t N>
inline std::size_t array_size(T (&)[N]) {
return N;
};
Vous devez savoir que cela fonctionne lorsque le compilateur est de voir la définition du tableau, mais pas après avoir été passé à une fonction (où il se désintègre en un pointeur):
void f(int array[])
{
//std::cout << array_size(array) << std::endl; // fails, at this point array is a pointer
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
f(array);
std::cout << array_size(array) << std::endl; // 5
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5
}
Oui, même je fais de même, Comme vous, j'attends de voir s'il y a d'autres façons de le faire. –
Renommer cette question en "Longueur d'un tableau en C" peut être une bonne idée. –
Ceci ne "détermine" pas la longueur au moment de l'exécution; la longueur est une constante à la compilation, et l'expression donnée est constante afin que le compilateur puisse simplement l'évaluer pendant la compilation et lui substituer la valeur correcte. En outre, pensez à laisser tomber la parenthèse; sizeof n'est pas une fonction. – unwind