J'ai récemment trouvé moi-même à l'aide de la macro suivante avec gcc 4.5 en C++11 mode:
#define RETURN(x) -> decltype(x) { return x; }
Et l'écriture de fonctions comme ceci:
template <class T>
auto f(T&& x) RETURN (( g(h(std::forward<T>(x))) ))
J'ai fait cela pour éviter le désagrément d'avoir à écrire efficacement le corps de la fonction deux fois, et d'avoir conserver les modifications dans le corps et le type de retour de la synchronisation (qui à mon avis est un désastre).
Le problème est que cette technique ne fonctionne que sur une seule ligne fonctions. Alors, quand j'ai quelque chose comme ceci (alambiquée exemple):
template <class T>
auto f(T&& x) -> ...
{
auto y1 = f(x);
auto y2 = h(y1, g1(x));
auto y3 = h(y1, g2(x));
if (y1) { ++y3; }
return h2(y2, y3);
}
Puis-je mettre quelque chose d'horrible dans le type de retour.
En outre, chaque fois que j'ai mise à jour de la fonction, je vais avoir besoin de changer le type de retour, et si je ne change pas correctement, j'ai obtiendrez une erreur de compilation si j'ai de la chance, ou à l'exécution d'un bogue dans le pire des cas. Avoir à copier et coller des modifications à deux endroits et de les garder synchronisés je ressens n'est pas une bonne pratique.
Et je ne peux pas penser à une situation où j'avais envie d'un cast implicite sur le retour au lieu d'un cast explicite.
Il y a sûrement une façon de demander au compilateur de déduire cette information. Quel est le point de le compilateur garder un secret? Je pensais que C++11 a été conçu de manière telle répétition ne serait pas nécessaire.