如何在VS2010中获取基于范围的loop / for_each的指针?

时间:2013-02-11 06:30:28

标签: c++ visual-studio-2010 visual-c++ boost c++11

我正在使用Visual Studio 2010.我想使用的一个功能,VS2010中遗漏的功能,但VS2012中包含的功能是基于范围的for循环。

在VS2012中,您可以进行整洁和超级整洁的循环,例如:

for( auto& it: myElements )
    it->something();

到目前为止,我在VS2010中最接近的是这种语法:

for( auto it = myElements.begin(), end = myElements.end(); it != end; it++ )
    it->something();

在阅读了一些相关问题后,我发现使用boost \ foreach我可以访问以下宏:

BOOST_FOREACH( auto it, myElements ){
    it.something();
}

我对这种方法的问题在于它提供了副本(或类似的东西),而不是指针。这是我感到困惑的地方。 foreach reference说明如下:

  

它不进行动态分配,不进行虚函数调用或   通过函数指针调用,不进行任何调用   对编译器的优化器透明。

这是什么意思?不是副本吗?

如何从BOOST_FOREACH获取指针?或者我应该使用其他一些加强功能吗?

我在其他问题中看到了这种语法:

BOOST_FOREACH( auto& it, myElements ){
    it->something();
}

但是这不能为我编译并在编辑器中抛出错误。这有什么问题?为什么我在这里找到许多其他问题的有效代码?

对于基于范围的for循环,VS2010中是否有任何漂亮而整洁的解决方案? (包括使用提升)

2 个答案:

答案 0 :(得分:2)

主要问题是,你有指针容器吗?即使在VS2012中,for(auto& it: myElements) it->something();仅适用于(智能)指针的容器。 &告诉您it是引用,->告诉您它是指针。这不是矛盾;你可以引用指针。

但是为什么你还想要一个指针呢?参考文献更具惯用性。

答案 1 :(得分:1)

这是错误的:

  

在VS2012中,您可以进行整洁和超级整洁的循环,例如:

for( auto& it: myElements )
    it->something();

基于范围的循环返回对对象的引用:

for(auto& element: myElements)
    element.something();

编辑

如果存储在容器中的对象是指针,或者是重载operator*的类的对象,例如智能指针,则第一种语法将是有效的。