Wraz z wydaniem GCC 4.8.0 mamy kompilator obsługujący automatyczne odejmowanie zwracanych typów, część C ++ 14. Dzięki -std=c++1y
, mogę to zrobić:
auto foo() { //deduced to be int
return 5;
}
Moje pytanie brzmi: kiedy powinienem używać tej funkcji? Kiedy jest to konieczne i kiedy powoduje, że kod staje się czystszy?
Scenariusz 1
Pierwszy scenariusz, jaki przychodzi mi do głowy, jest możliwy, kiedy tylko jest to możliwe. Każda funkcja, którą można w ten sposób zapisać, powinna być. Problem polega na tym, że nie zawsze może to uczynić kod bardziej czytelnym.
Scenariusz 2
Następnym scenariuszem jest uniknięcie bardziej złożonych typów zwrotów. Jako bardzo lekki przykład:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Nie wierzę, że kiedykolwiek byłby to naprawdę problem, chociaż wydaje mi się, że posiadanie typu zwracanego jawnie zależnego od parametrów może być w niektórych przypadkach wyraźniejsze.
Scenariusz 3
Następnie, aby zapobiec redundancji:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
W C ++ 11 możemy czasami po prostu return {5, 6, 7};
zastąpić wektor, ale to nie zawsze działa i musimy określić typ zarówno w nagłówku funkcji, jak i jej treści. Jest to całkowicie nadmiarowe, a automatyczne odliczanie typu zwracanego chroni nas przed tą nadmiarowością.
Scenariusz 4
Wreszcie może być używany zamiast bardzo prostych funkcji:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Czasami jednak możemy spojrzeć na funkcję, chcąc poznać dokładny typ, a jeśli nie jest tam podany, musimy przejść do innego punktu w kodzie, np. Gdzie pos_
jest zadeklarowane.
Wniosek
Po przedstawieniu tych scenariuszy, który z nich faktycznie okazuje się sytuacją, w której ta funkcja jest przydatna w oczyszczaniu kodu? A co ze scenariuszami, o których tu zapomniałem? Jakie środki ostrożności należy podjąć przed użyciem tej funkcji, aby później mnie nie ugryzła? Czy jest coś nowego, co ta funkcja wnosi do stołu, a bez niej nie jest możliwe?
Zwróć uwagę, że wiele pytań ma być pomocą w znalezieniu perspektyw, z których można na to odpowiedzieć.
->decltype(t+u)
autodliczeniem zabija SFINAE.