用"纯"C++ 11替代替换BOOST_FOREACH?

Fle*_*exo 19 c++ boost 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

关键特性是将键/值对保留在k和的引用中v.

我试过了:

for(std::tie(k,v) : map)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

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

但是基于for循环的想法似乎都不起作用.据推测,基于范围的for循环需要在之前有一个声明:,因为偶数:

std::vector<int> test;
int i;
for (i : test);
Run Code Online (Sandbox Code Playgroud)

无效.

我能找到的最接近的等价物是:

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

这不像BOOST_FOREACH版本那么简洁!

有没有办法在C++ 11中没有提升的情况下简洁地表达同样的事情?

Ben*_*ley 24

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