mai
2010
Après avoir abordé decltype dans mon dernier billet, passons au « Trailing return type » ou en français la mise en place du type de retour (je n’ai pas trouvé mieux comme traduction).
Cette syntaxe utilisée dans les expressions lambda permet de spécifier le type de retour d’une fonction.
Considérons les deux exemples qui suivent :
L’expression la plus simple :
{
return 1L;
}
J’ai spécifié que le type de retour était un long grâce à la syntaxe -> type
Bien entendu cet exemple comme celui qui va suivre est franchement improbable dans notre codage de tous les jours.
{
return 1.0;
}
Cette fois-ci le retour est spécifié par l’évaluation de l’expression contenue dans decltype.
Alors franchement à quoi cela peut il servir ?
Cette syntaxe peut avoir son utilité avec l’utilisation des modèles (template).
Par exemple avec cette fonction template que j’écris initialement comme suit :
Arg2 AddItem(Arg1 a1, Arg2 a2)
{
return a1 + a2;
}
Cette fonction se propose d’additionner deux types de données, pour spécifier le retour de ma fonction j’ai spécifié de manière arbitraire le type Arg2 ce qui réduit fortement les possibilités d’utilisation de ma fonction.
Si je reprends mon exemple sur les rvalues avec la classe XDate et que je veuille écrire ce genre de chose :
auto result=AddItem(d, 1);
cet exemple ne passera pas à la compilation.
auto AddItem(Arg1 a1, Arg2 a2) -> decltype(a1+a2)
{
return a1 + a2;
}
Celui-ci par contre fonctionne très bien, auto me permet de rester neutre sur le retour qui sera évalué par decltype.
Pour être complet dans mon exemple j’ai du rajouté l’opérateur + dans ma classe XDate pour que l’exemple compile.
{
//…..
friend XDate operator+(XDate&& left, const int nDayRight);
friend XDate operator+(const XDate& left, const int nDayRight);
//…
};
XDate operator+(const XDate & left, const int nDayRight)
{
XDate date;
// …
TRACE("\nM+:Date:%04X ->(%s)",date.c_str(),date.c_str());
// operation de concatenation du jour non implementée...
return date;
}
Dans cet exemple on voit la puissance du mécanisme puisque l’expression spécifiée dans decltype à permis au compilateur de déterminer le retour puisque l’opérateur + de XDate était disponible.
L’exemple suivant fonctionne aussi sans avertissement de conversion :
auto v=AddItem(10.,1);
J’additionne un double et un entier.
Pour finir j’ai constaté que dans cet exemple IntelliSense ne savait pas trop comment s’en sortir avec cette utilisation.
Articles récents
Commentaires récents
Archives
- septembre 2010
- mai 2010
- avril 2010
- février 2010
- août 2009
- juin 2009
- mai 2009
- février 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006