Я недавно обнаружил, что использую следующий макрос с gcc 4.5 в режиме C ++ 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);
}
Затем я должен добавить что-то ужасное в тип возвращаемого значения.
Кроме того, всякий раз, когда я обновляю функцию, я будуМне нужно изменить тип возвращаемого значения, и если я не изменю его правильно, я получу ошибку компиляции, если мне повезет, или ошибку времени выполнения в худшем случае.Необходимость копировать и вставлять изменения в двух местах и поддерживать их синхронизацию, я считаю, не является хорошей практикой.
И я не могу вспомнить ситуацию, когда я хотел бы получить неявное приведение по возвращению вместо явногоcast.
Конечно, есть способ попросить компилятор вывести эту информацию.Какой смысл компилятору хранить это в секрете?Я думал, что C ++ 11 спроектирован так, что такое дублирование не потребуется.