Недавно я обнаружил, что использую следующий макрос с gcc 4.5 в режиме С++ 11:
#define RETURN(x) -> decltype(x) { return x; }
И записывать такие функции:
template <class T>
auto f(T&& x) RETURN (( g(h(std::forward<T>(x))) ))
Я делал это, чтобы избежать неудобств, связанных с тем, чтобы эффективно написать тело функции дважды, и сохраняя изменения в теле и возвращаемом типе в синхронизации (что, на мой взгляд, является катастрофой, ожидающей своего появления).
Проблема заключается в том, что этот метод работает только на одной линейной функции. Поэтому, когда у меня есть что-то вроде этого (свернутый пример):
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);
}
Тогда мне нужно поставить что-то ужасное в возвращаемом типе.
Кроме того, всякий раз, когда я обновляю функцию, мне нужно будет изменить тип возвращаемого значения, и если я не изменю его правильно, я получу ошибку компиляции, если мне повезет, или ошибка времени выполнения в худший случай. Чтобы скопировать и вставить изменения в два местоположения и сохранить их в синхронизации, я чувствую, что это не хорошая практика.
И я не могу придумать ситуацию, когда я хочу использовать неявный приведение в действие вместо явного приведения.
Конечно, есть способ попросить компилятор вывести эту информацию. Какой смысл компилятора хранить в секрете? Я думал, что С++ 11 был разработан таким образом, чтобы такое дублирование не требовалось.