Ce code fonctionne ... Mais pourquoi ?

Le
mderie
template<typename T, size_t size>
size_t getArraySize(T(&) [size])
{
return size;
}

int main(int argc, char* argv[])
{
char dummy[31];
printf("getArraySize(dummy) = %ul", getArraySize(dummy)); //
Display 31 !

return 0;
}



Je comprends que la deduction de template arrive a matcher dummy comme
un tableau de char a x elements.
Et donc de faire d'un parametre deux valeurs (deja baleze)
Mais je ne comprends pas c'est l'ecriture T(&) [size] ! Que represente
ce (&) ? Et ou est le nom de la variable
tableau si on voulait l'utiliser dans la fonction ?

Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #18452351
mderie a écrit :

Mais je ne comprends pas c'est l'ecriture T(&) [size] ! Que represente
ce (&) ?



Passage par référence.

Et ou est le nom de la variable
tableau si on voulait l'utiliser dans la fonction ?



T(& tableau) [size]

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
James Kanze
Le #18453611
On Jan 21, 9:55 pm, mderie
template<typename T, size_t size>
size_t getArraySize(T(&) [size])
{
return size;
}



int main(int argc, char* argv[])
{
char dummy[31];
printf("getArraySize(dummy) = %uln", getArraySize(dummy));
// Display 31 !
return 0;
}
---



Je comprends que la deduction de template arrive a matcher dummy comme
un tableau de char a x elements.
Et donc de faire d'un parametre deux valeurs (deja baleze)...
Mais je ne comprends pas c'est l'ecriture T(&) [size] ! Que represente
ce (&) ?



Comme a dit Mickaël, ça veut dire que le paramètre est une
référence. Ce qui est très important ici, parce que la
conversion implicite de tableau en pointeur n'a pas lieu lorsque
le tableau sert à l'initialisation d'une référence ; si on
avait écrit :

size_t getArraySize( A[size] ) ...

le type du paramètre aurait en fait été A*, le symbole
« size » n'aurait été que commentaire, et la déduction
n'aurait pas pû avoir lieu.

Et ou est le nom de la variable tableau si on voulait
l'utiliser dans la fonction ?



Exactement comme pour n'importe quel autre déclaration de
référence :

template< typename T, std::size_t N >
T*
begin( T (&array)[ N ] )
{
return array ;
}

template< typename T, std::size_t N >
T*
end( T (&array)[ N ] )
{
return array + N ;
}

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
mderie
Le #18454471
Waooow, un parametre non-nomme Damn it !

Un tout grand merci, j'aurai jamais trouve tout seul :(

J'avais essaye sans les parentheses autour du & :
T& [size] mais le compilo me parlait d'un tableau de references vers
des T
ce qui est tres justement interdit...

Manifestement, le C++ me reserve encore bon nombres de surprises...

BTW : je suis fort impatient au sujet du C++09 !

Bien a vous.
Publicité
Poster une réponse
Anonyme