I nuovi loop basati su range migliorano davvero la leggibilità e sono davvero facili da usare. Tuttavia, considerare quanto segue:C++ 11 range-based per e mappa: leggibilità
map<Foo,Bar> FooAndAssociatedBars;
for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
FooAndAssociatedBar.first.doSth();
FooAndAssociatedBar.second.doSomeOtherThing();
}
Può essere un dettaglio, ma trovo che sarebbe stato più leggibile se avrei potuto fare qualcosa di simile:
for ((auto& foo, auto& bar) : FooAndAssociatedBars) {
foo.doSth();
bar.doSomeOtherThing();
}
Sai una sintassi equivalente?
EDIT: Buone notizie: C++ 17 ha una proposta che adresses questo problema, chiamato binding strutturati (vedi 1). In C++ 17, si dovrebbe essere in grado di scrivere:
tuple<T1,T2,T3> f(/*...*/) {
/*...*/
return {a,b,c};
}
auto [x,y,z] = f(); // x has type T1, y has type T2, z has type T3
che risolve questo problema leggibilità
In che modo il compilatore potrebbe indovinare a cosa dovevano riferirsi 'Foo' e' Bar'? –
@PeteBecker Beh, foo è solo un modo conveniente per dire "name foo la parte sinistra della std :: pair". In termini assoluti, è possibile farlo in fase di compilazione: questa è solo una comodità notazionale. Mi chiedevo se fosse possibile ottenere tale effetto tramite sovraccarico o qualcosa del genere –
Sì, è certamente possibile richiedere al compilatore di conoscere 'std :: pair' o cercare qualsiasi struttura con elementi chiamati' first' e ' secondo'; è piuttosto specializzato e probabilmente non appropriato per la standardizzazione. La prossima richiesta sarebbe per tutti gli elementi di una 'tupla' ... –