Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ce code fonctionne ... Mais pourquoi ?

3 réponses
Avatar
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\n", 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...

3 réponses

Avatar
Mickaël Wolff
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 <http://lupusmic.org/pro/>
Avatar
James Kanze
On Jan 21, 9:55 pm, mderie wrote:

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
Avatar
mderie
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.