Skip to content

Commit 5c135f1

Browse files
committed
C++ Auto : auto par défaut
1 parent 7f0bc2d commit 5c135f1

File tree

1 file changed

+56
-1
lines changed

1 file changed

+56
-1
lines changed

_articles/c++_auto.md

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,60 @@ L'usage explicite de ``auto*`` permet de signaler de manière claire que vous tr
9393
> L'écriture ``auto c_string0 = std::data(string);`` est quant à elle nommée "**auto to stick**".<br>
9494
> Elle consiste à déduire le type de la variable ``c_string0`` en fonction du type retourné par la fonction ``std::data``.
9595
96+
### ``auto`` par défaut
97+
98+
Ne pas renseigner explicitement le type d'une variable peut permettre une plus grande généricité, notamment dans des templates.
99+
100+
Prenons ce code pour illustrer:
101+
{% highlight cpp linenos highlight_lines="4" %}
102+
void printFirstValue(const std::vector<int>& container)
103+
{
104+
if (std::empty(container)) return;
105+
int firstValue = container[0];
106+
std::print("{}\n", firstValue);
107+
}
108+
109+
int main()
110+
{
111+
auto vector = std::vector{1, 2, 3};
112+
printFirstValue(vector);
113+
}
114+
{% endhighlight %}
115+
116+
Ici, le type de ``firstValue`` est écrit explicitement. Si nous transformons la fonction ``printFirstValue`` en template pour la rendre générique, il faudra revoir tout le code de cette fonction pour en ajuster les types.
117+
{% highlight cpp linenos highlight_lines="5" %}
118+
template<class T>
119+
void printFirstValue(const std::vector<T>& container)
120+
{
121+
if (std::empty(container)) return;
122+
T firstValue = container[0];
123+
std::print("{}\n", firstValue);
124+
}
125+
126+
int main()
127+
{
128+
auto vector = std::vector{1, 2, 3};
129+
printFirstValue(vector);
130+
}
131+
{% endhighlight %}
132+
133+
Nous n'aurions pas eu à modifier le corps de la fonction si celle-ci utilisait ``auto`` pour permettre que le type de ``firstValue`` soit inféré à partir de son initialisation.
134+
{% highlight cpp linenos highlight_lines="5" %}
135+
template<class T>
136+
void printFirstValue(const std::vector<T>& container)
137+
{
138+
if (std::empty(container)) return;
139+
auto firstValue = container[0]; // firstValue prend un type différent selon le type de container passé en paramètre
140+
std::print("{}\n", firstValue);
141+
}
142+
143+
int main()
144+
{
145+
auto vector = std::vector{1, 2, 3};
146+
printFirstValue(vector);
147+
}
148+
{% endhighlight %}
149+
96150
### Common type deduction
97151

98152
Lorsqu'un type dépend de plusieurs expressions, l'utilisation de ``auto`` permet au compilateur de déduire le [type commun](/articles/c++/type_traits#type_commun) entre les différentes expressions possibles.
@@ -327,7 +381,8 @@ Certains développeurs préfèrent utiliser ``auto`` **avec parcimonie**, en **r
327381

328382
Parfois en évitant de l'utiliser à cause des noms de fonctions et variables **pas assez explicites** sur le type qu'elles contiennent ou retournent (c'est l'argument principal que j'entend).<br>
329383
Ceci est très courant, notamment dans un cadre professionnel où plusieurs développeurs collaborent sur le même projet.<br>
330-
Aux personnes qui sont dans cette situation, je recommanderais d'utiliser un IDE qui montre les **types des variables** et les **signatures des fonctions** au **survol de la souris**.
384+
Aux personnes qui sont dans cette situation, je recommanderais d'utiliser un IDE qui montre les **types des variables** et les **signatures des fonctions** au **survol de la souris**.<br>
385+
Je voudrais aussi souligner [cet avantage](#auto-par-défaut) à généraliser l'utilisation de ``auto``.
331386

332387
D'autres seraient même tentés de ne jamais utiliser ``auto``, et passer à côté de tous les autres avantages qu'il apporte.
333388

0 commit comments

Comments
 (0)