目前在我们正在开发的一个大型c ++项目中,我们有一堆新的循环样式,如下所示:
for (auto& value : values)
到目前为止,我们一直在使用gcc 4.6进行编译。最近一些代码库被移植到Windows,一些开发人员希望在msvc ++ 10中编译,但似乎还没有完全支持新的for循环语法。
非常希望不必重写所有出现此语法的地方。
解决此问题的最佳方法是什么?
更新:看起来这个问题已在MSVC11中得到解决。
答案 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
),并且您不能使用控制流结构(break
,continue
,{{ 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;
}