Заменить BOOST_FOREACH на «чистую» альтернативу C++11?

Можно ли заменить BOOST_FOREACHв данном примере «чистым» эквивалентом 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;
  }
}

Ключевой особенностью является сохранение пары ключ/значение в ссылках на kи v.

Я попытался:

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

и

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

Но ни одна из идей, основанных на цикле, казалось, не сработала. Предположительно, цикл ranged based for должен иметь объявление перед :, так как даже:

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

не является допустимым.

Ближайший эквивалент, который я могу найти:

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

, который не так лаконичен, как версия BOOST_FOREACH!

Есть ли способ выразить одно и то же кратко без усиления в C++11?

19
задан ildjarn 9 May 2012 в 20:38
поделиться