Con GCC 4.8.0 rilasciato, abbiamo un compilatore che supporta la deduzione automatica del tipo di ritorno, parte di C ++ 14. Con -std=c++1y
, posso fare questo:
auto foo() { //deduced to be int
return 5;
}
La mia domanda è: quando dovrei usare questa funzione? Quando è necessario e quando rende il codice più pulito?
scenario 1
Il primo scenario che mi viene in mente è quando possibile. Ogni funzione che può essere scritta in questo modo dovrebbe essere. Il problema è che potrebbe non rendere sempre più leggibile il codice.
Scenario 2
Il prossimo scenario è quello di evitare tipi di ritorno più complessi. A titolo di esempio molto chiaro:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Non credo che sarebbe mai un problema, anche se immagino che il tipo di ritorno dipenda esplicitamente dai parametri potrebbe essere più chiaro in alcuni casi.
Scenario 3
Successivamente, per prevenire la ridondanza:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
In C ++ 11, a volte possiamo solo return {5, 6, 7};
al posto di un vettore, ma ciò non sempre funziona e dobbiamo specificare il tipo sia nell'intestazione della funzione che nel corpo della funzione. Questo è puramente ridondante e la deduzione automatica del tipo di ritorno ci salva da quella ridondanza.
Scenario 4
Infine, può essere utilizzato al posto di funzioni molto semplici:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
A volte, tuttavia, potremmo guardare la funzione, volendo conoscere il tipo esatto, e se non viene fornito lì, dobbiamo andare in un altro punto del codice, come dove pos_
è dichiarato.
Conclusione
Con questi scenari definiti, quale di essi si rivela effettivamente una situazione in cui questa funzionalità è utile per rendere il codice più pulito? Che dire degli scenari che ho trascurato di menzionare qui? Quali precauzioni dovrei prendere prima di utilizzare questa funzione in modo che non mi morda in seguito? C'è qualcosa di nuovo che questa funzionalità porta sul tavolo che non è possibile senza di essa?
Si noti che le domande multiple sono pensate per essere di aiuto nel trovare prospettive da cui rispondere.
->decltype(t+u)
con la deduzione automatica uccide SFINAE.