Tout d'abord, vous devez comprendre qu'en essayant d'extraire une valeur d'un tableau, vous pouvez obtenir un pointeur sur son premier élément :
int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost
Les références font référence à des objets en utilisant leur type exact ou leur type de base. La clé est que le modèle prend les tableaux par référence. Les tableaux (et non les références à ceux-ci) en tant que paramètres n'existent pas en C++. Si vous donnez à un paramètre un type de tableau, ce sera un pointeur à la place. L'utilisation d'une référence est donc nécessaire lorsque nous voulons connaître la taille du tableau passé. La taille et le type de l'élément sont automatiquement déduits, comme c'est généralement le cas pour les modèles de fonctions. Le modèle suivant
template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
Appelé avec notre tableau précédemment défini a
instancie implicitement la fonction suivante :
size_t array_size(const int (&)[3]) {
return 3;
}
Qui peut être utilisé comme ceci :
size_t size_of_a = array_size(a);
Il y a une variation que j'ai inventée il y a quelque temps. [Edit : il s'avère que quelqu'un a déjà eu cette même idée aquí ] qui peut déterminer une valeur au moment de la compilation. Au lieu de renvoyer la valeur directement, il donne au modèle un type de retour qui dépend de n
:
template<typename T, size_t n>
char (& array_size(const T (&)[n]) )[n];
Vous dites que si le tableau a n
le type de retour est une référence à un tableau de taille n
et le type d'élément char
. Maintenant, vous pouvez obtenir une taille déterminée au moment de la compilation pour le tableau passé :
size_t size_of_a = sizeof(array_size(a));
Parce qu'un tableau de char
ayant n
Les éléments ont une taille de n
qui vous donnera également le nombre d'éléments dans le tableau donné. Au moment de la compilation, vous pouvez donc faire
int havingSameSize[sizeof(array_size(a))];
Comme la fonction n'est jamais appelée, elle n'a pas besoin d'être définie et n'a donc pas de corps. J'espère que j'ai pu clarifier un peu le problème.