基于MSVC 10范围的循环



目前,在我们正在进行的一个大型c++项目中,我们有一系列新的循环样式,如下所示:

for (auto& value : values)

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

不必重写出现这种语法的所有地方是非常可取的。

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

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

您可以使用Boost.Foreach:

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

一种方法是尽可能用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),并且不能使用控制流结构(breakcontinuereturn)。

另一种方法是,当您需要这些控制流结构时,对循环使用旧样式。它们没有错,尤其是使用auto来推断迭代器类型。

另一种方法可能是在Visual Studio 11测试版发布时使用它,它支持基于范围的循环IIRC。:)

您不必使用boost
下面是一个简单的宏,用于向后兼容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 << " ";
}

您可以使用for each本身

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

最新更新