替换“纯” C ++ 11替代BOOST_FOREACH?(Replace BOOST_FOREAC

2019-07-29 07:39发布

是否有可能替换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;
  }
}

关键特征被保持在引用的键/值对来kv

我试过了:

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;
}

但没有一个基于不等for循环的想法似乎工作。 大概是基于不等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升压的方法吗?

Answer 1:

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


Answer 2:

这将产生输出作为升压宏相同

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


文章来源: Replace BOOST_FOREACH with “pure” C++11 alternative?