Avec la sortie de GCC 4.8.0, nous avons un compilateur qui prend en charge la déduction automatique du type de retour, qui fait partie de C ++ 14. Avec -std=c++1y
, je peux faire ceci:
auto foo() { //deduced to be int
return 5;
}
Ma question est la suivante: quand dois-je utiliser cette fonctionnalité? Quand est-ce nécessaire et quand rend-il le code plus propre?
Scénario 1
Le premier scénario auquel je peux penser est dans la mesure du possible. Chaque fonction qui peut être écrite de cette façon devrait l'être. Le problème avec cela est que cela ne rend pas toujours le code plus lisible.
Scénario 2
Le scénario suivant consiste à éviter des types de retour plus complexes. A titre d'exemple très léger:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Je ne crois pas que ce serait jamais vraiment un problème, bien que je suppose que le type de retour dépende explicitement des paramètres pourrait être plus clair dans certains cas.
Scénario 3
Ensuite, pour éviter la redondance:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
En C ++ 11, nous pouvons parfois simplement return {5, 6, 7};
remplacer un vecteur, mais cela ne fonctionne pas toujours et nous devons spécifier le type à la fois dans l'en-tête de la fonction et dans le corps de la fonction. C'est purement redondant, et la déduction automatique du type de retour nous évite cette redondance.
Scénario 4
Enfin, il peut être utilisé à la place de fonctions très simples:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Parfois, cependant, nous pouvons regarder la fonction, voulant connaître le type exact, et s'il n'y est pas fourni, nous devons aller à un autre point du code, comme où pos_
est déclaré.
Conclusion
Avec ces scénarios présentés, lequel d'entre eux s'avère être une situation dans laquelle cette fonctionnalité est utile pour rendre le code plus propre? Qu'en est-il des scénarios que j'ai négligé de mentionner ici? Quelles précautions dois-je prendre avant d'utiliser cette fonctionnalité pour qu'elle ne me morde pas plus tard? Y a-t-il quelque chose de nouveau que cette fonctionnalité apporte à la table qui ne serait pas possible sans elle?
Notez que les multiples questions visent à aider à trouver des perspectives à partir desquelles y répondre.
->decltype(t+u)
par la déduction automatique tue SFINAE.