MSVC 10基于环路的范围

时间:2012-02-10 02:13:31

标签: c++ visual-c++ c++11

目前在我们正在开发的一个大型c ++项目中,我们有一堆新的循环样式,如下所示:

for (auto& value : values)

到目前为止,我们一直在使用gcc 4.6进行编译。最近一些代码库被移植到Windows,一些开发人员希望在msvc ++ 10中编译,但似乎还没有完全支持新的for循环语法。

非常希望不必重写所有出现此语法的地方。

解决此问题的最佳方法是什么?

更新:看起来这个问题已在MSVC11中得到解决。

4 个答案:

答案 0 :(得分:7)

您可以使用Boost.Foreach

//Using Xeo's example:
BOOST_FOREACH (auto& e, values) {
    std::cout << e << " ";
}

答案 1 :(得分:3)

一种方法是尽可能用std::for_each和lambdas替换它们。 GCC 4.6和MSVC10都支持lambda表达式。

// before:
for(auto& e : values){
  std::cout << e << " ";
}

// after:
std::for_each(values.begin(), values.end(),
    [](a_type& e){
      std::cout << e << " ";
    });

唯一需要注意的是,您需要实际键入元素名称(此处为a_type),并且您不能使用控制流结构(breakcontinue,{{ 1}})。

另一种方法是,当您需要这些控制流结构时,使用旧式for循环。它们没有任何问题,特别是使用return来推断迭代器类型。

另一种方法可能是在外观时使用Visual Studio 11 beta,它支持基于范围的for循环IIRC。 :)

答案 2 :(得分:2)

您不必使用提升 这是一个与vs2010向后兼容的简单宏:

// 1600 is VS2010
#if _MSC_VER == 1600
    #define FOR_EACH(var , range) for each(var in range)
#else
    #define FOR_EACH(var , range) for (var : range)
#endif

像这样使用:

FOR_EACH(auto& e, values) {
    std::cout << e << " ";
}

答案 3 :(得分:0)

您可以使用for each本身

for each (auto value in values) {
std::cout << value << endl;
}