基于MSVC 10范围的循环
MSVC 10 range based for loop
目前,在我们正在进行的一个大型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
),并且不能使用控制流结构(break
、continue
、return
)。
另一种方法是,当您需要这些控制流结构时,对循环使用旧样式。它们没有错,尤其是使用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;
}
相关文章:
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么基于循环范围不直接在C 中使用参数阵列
- 为什么这个循环变量在循环范围之外是可访问的
- 在基于范围的循环范围内的双/整数使用和数据缩小
- 是cbegin/Cend不足以使循环范围
- 变量循环范围会导致返回局部变量的地址引用
- 地图元素上的循环范围
- 使用基于自动的范围用于循环VS,使用对循环范围的基于对的范围
- 访问 C++ 中 if 循环范围之外的矢量
- 循环范围内的初始值设定项列表
- 用于循环范围范围
- 为什么需要两个循环范围来更改C++向量的这些元素
- 在下一个循环之前访问基于 for 循环范围的下一个元素
- 在循环范围之外声明参数是否更有效?
- 循环范围拆分中的变量预评估
- 为什么我的循环范围不会改变元素?
- 我的循环范围不起作用
- 循环范围在使用索引元素时不起作用
- 对基于循环范围的误解