c++ boost c++11 boost-foreach

¿Reemplazar BOOST_FOREACH con una alternativa “pura” de C++ 11?



c++11 boost-foreach (2)

¿Es posible reemplazar el BOOST_FOREACH en este ejemplo con un equivalente "puro" de C ++ 11?

#include <map> #include <functional> #include <boost/foreach.hpp> #include <iostream> int main() { std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")}; int k; std::string v; BOOST_FOREACH(std::tie(k, v), map) { std::cout << "k=" << k << " - " << v << std::endl; } }

La característica clave es mantener el par clave / valor en las referencias a k y v .

Lo intenté:

for(std::tie(k,v) : map) { std::cout << "k=" << k << " - " << v << std::endl; }

y

auto i = std::tie(k,v); for(i : map) { std::cout << "k=" << k << " - " << v << std::endl; }

Pero ninguna de las ideas basadas en rangos basados ​​en bucles parecía funcionar. Presumiblemente, el rango para el bucle for está obligado a tener una declaración antes de : dado que incluso:

std::vector<int> test; int i; for (i : test);

No es valido

El equivalente más cercano que puedo encontrar es:

for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it) { std::cout << "k=" << k << " - " << v << std::endl; }

¡que no es tan sucinta como la versión BOOST_FOREACH !

¿Hay una manera de expresar lo mismo de manera sucinta sin impulso en C ++ 11?


Esto produce la misma salida que la macro Boost.

for( auto const& k : map ) { std::cout << "k = " << k.first << " - " << k.second << std::endl; }


for (auto & i : map) { std::tie(k,v) = i; // your code here }