versiones guia español actualizar c++ c++11 dictionary foreach code-readability

c++ - guia - qgis español



C++ 11 basado en rango para y mapa: legibilidad (3)

Esta pregunta ya tiene una respuesta aquí:

Los nuevos bucles for basados ​​en rango realmente mejoran la legibilidad y son realmente fáciles de usar. Sin embargo, considere lo siguiente:

map<Foo,Bar> FooAndAssociatedBars; for (auto& FooAndAssociatedBar : FooAndAssociatedBars) { FooAndAssociatedBar.first.doSth(); FooAndAssociatedBar.second.doSomeOtherThing(); }

Puede ser un detalle, pero creo que hubiera sido más legible si hubiera podido hacer algo como:

for ( (auto& foo, auto& bar) : FooAndAssociatedBars) { foo.doSth(); bar.doSomeOtherThing(); }

¿Conoces una sintaxis equivalente?

EDITAR: Buenas noticias: C ++ 17 tiene una propuesta que aborda este problema, llamado enlaces estructurados (ver 1 ). En C ++ 17, debería poder escribir:

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

que resuelve este problema de legibilidad


No es Buena idea. Tarde o temprano, desearía lo mismo para una std::tuple , y el compilador debería poder usar std::get<> en la tuple automáticamente. En mi opinión, su enfoque le está complaciendo solo en este momento, y encontrará problemas con este enfoque (suponga que se implementa de esa manera).

El comité estándar ha diseñado un bucle for basado en rangos con una consideración profunda. Es mucho mejor que el bucle foreach en otros idiomas, y es mucho más corto. Combínelo con auto& y ¡listo!


No hay tal cosa como tú quieres. Lo más cercano es declarar variables dentro del ciclo:

for (auto& FooAndAssociatedBar : FooAndAssociatedBars) { auto& foo = FooAndAssociatedBar.first; auto& bar = FooAndAssociatedBar.second; // ... }


Y por supuesto, siempre tienes la posibilidad de usar lambdas.

std::map<int, const char*> m { { 4, "hello" }, { 11, "c++" } }; convenient_for_each(m, [](int a, const char* b) { std::cout << b << a << std::endl; }); convenient_for_each(m, [](std::pair<int, const char> p) { std::cout << p.first << p.second << std::endl; });

O envuelto como macro (no recomendado)

FOREACH((int a, const char* b), m, std::cout << a << b << std::endl); FOREACH((std::pair<int, const char*> p), m, std::cout << p.first << p.second << std::endl);

( Implementación de muestra de Hackish en LWS )

Aunque Auto no funcionará, todavía estoy esperando lambdas polimórficas. Mi enfoque es teóricamente capaz de manejar tuplas también.