目前,在我们正在进行的一个大型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;
}