З випуском GCC 4.8.0 у нас є компілятор, який підтримує автоматичне відрахування типу повернення, що є частиною C ++ 14. З -std=c++1y
, я можу зробити це:
auto foo() { //deduced to be int
return 5;
}
Моє запитання: Коли я повинен використовувати цю функцію? Коли це потрібно і коли це робить код чистішим?
Сценарій 1
Перший сценарій, про який я можу придумати, - це коли це можливо. Кожна функція, яка може бути записана таким чином, повинна бути. Проблема в цьому полягає в тому, що він не завжди може зробити код більш читабельним.
Сценарій 2
Наступний сценарій - уникати більш складних типів повернення. Як дуже легкий приклад:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Я не вірю, що це колись справді буде проблемою, хоча я думаю, що тип повернення явно залежить від параметрів, в деяких випадках може бути зрозумілішим.
Сценарій 3
Далі, щоб запобігти надмірності:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
У C ++ 11 ми можемо іноді просто return {5, 6, 7};
замість вектора, але це не завжди виходить, і нам потрібно вказати тип і в заголовку функції, і в тілі функції. Це суто зайве, і автоматичне відрахування типу повернення рятує нас від цієї надмірності.
Сценарій 4
Нарешті, його можна використовувати замість дуже простих функцій:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Однак іноді ми можемо подивитися на функцію, бажаючи дізнатися точний тип, і якщо вона там не передбачена, нам доведеться перейти до іншої точки коду, наприклад, де pos_
оголошено.
Висновок
З викладеними сценаріями, який із них насправді виявляється ситуацією, коли ця функція корисна для того, щоб зробити код чистішим? Що про сценарії, які я тут нехтував згадувати? Які заходи обережності слід вжити, перш ніж використовувати цю функцію, щоб вона не кусала мене згодом? Чи є щось нове, що ця функція приносить до столу, що без неї неможливо?
Зауважте, що декілька питань мають на меті допомогти у пошуку перспектив, з яких можна відповісти на це.
->decltype(t+u)
автоматичного відрахування вбиває SFINAE.