Comment fonctionne la fonction de modèle «taille du tableau»?

Dupliqués possibles:
Quelqu’un peut-il expliquer ce code de modèle qui me donne la taille d’un tableau?
Des arguments magiques dans les modèles de fonction…

Quelqu’un peut-il expliquer comment ce code fonctionne? Je sais que le but de ce code est d’obtenir la longueur d’un tableau, mais je ne sais pas comment fonctionne ce code:

template int GetArrLength(T(&)[size]){return size;} 

Merci.

Commençons par disséquer le paramètre T(&)[size] . Lisez les déclarations de l’intérieur, de droite à gauche, le groupe de parenthèses en premier: c’est un paramètre sans nom qui fait référence à un tableau de size de type T

Autrement dit, il accepte une référence à tout tableau, où le type et la taille du tableau sont des parameters de modèle.

Si nous l’appelons comme tel:

 int a[10]; GetArrLength(a); 

Le compilateur va essayer de déduire les parameters du template. Pour que le type de paramètre corresponde à ce que vous passez, T doit être int et size doit être 10 (ce qui fait du paramètre une référence à un tableau de 10 int s).

Vous retournez ensuite cette taille, vous donnant le nombre d’éléments dans un tableau.


Il y a deux “problèmes” avec ce code. Tout d’abord, les tailles ne peuvent pas être négatives, il est donc inutile d’utiliser un type signé comme paramètre de modèle et type de retour. Au contraire, un type non signé doit être utilisé. mieux serait std::size_t :

 template std::size_t GetArrLength(T(&)[Size]) { return size; } 

La seconde est que le résultat de cette fonction n’est pas une expression constante, même si la taille d’un tableau est. Bien que ce soit bien dans la plupart des situations, il serait préférable que nous puissions en tirer une expression constante. C’est là que vous vous retrouvez avec cette solution:

 template  struct type_of_size { typedef char type[N]; }; template  typename type_of_size::type& sizeof_array_helper(T(&)[Size]); #define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray)) 

Ceci est utilisé en tant que tel:

 int a[10]; const std::size_t n = sizeof_array(a); // constant-expression! 

Cela fonctionne par trois choses: la première est la même idée que ci-dessus, les parameters de modèle seront remplis en vous donnant la taille du tableau.

La seconde partie utilise cette information pour créer un type avec une taille spécifique, donc l’assistant type_of_size . Cette partie n’est pas ssortingctement nécessaire, mais je pense que cela facilite la lecture du code. Un char[N] a une taille égale à N , toujours, donc on peut en abuser pour “stocker” la taille du tableau … dans la taille d’un type lui-même!

La troisième partie consiste à obtenir cette taille avec sizeof . Il n’évalue en fait rien, donc nous n’avons pas besoin d’une définition pour la fonction. Il dit simplement “Si vous deviez le faire … la taille serait …”. Et la taille est notre taille “stockée”, dans le tableau de caractères.