【问题标题】:How to get pointers from range-based loop / for_each in VS2010?如何从 VS2010 中基于范围的循环/for_each 获取指针?
【发布时间】:2013-01-26 06:03:20
【问题描述】:

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

在 VS2012 中,您可以做整洁且超级整洁的 for 循环,例如:

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();
}

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

在 VS2010 中是否有针对基于范围的 for 循环的漂亮而整洁的解决方案? (包括使用 boost)

【问题讨论】:

  • 不相关,但使用 for range 循环,您不必取消引用任何内容。
  • 如果我尝试以it.setSomething( 0 ) 的方式修改任何内容,它就会消失。
  • 你知道有些迭代器在修改后会失效吗?
  • 我猜这是一个参考?此外,请使用std::for_each。

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


【解决方案1】:

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

但是你为什么还要指针呢?引用更为惯用。

【讨论】:

  • 感谢您,我看到的项目似乎广泛使用了智能指针,因此编写该行是标准的(但令人困惑)。混乱的另一部分是boost reference page 中的几乎所有示例都没有&,例如std::list<int> list_int( /*...*/ ); BOOST_FOREACH( int i, list_int ) { // do something with i },而这里// do something with i 非常令人困惑。在 FOR_EACH 中不使用引用时,不只是原始对象的副本吗?
【解决方案2】:

这是错误的:

在 VS2012 中,您可以做整洁且超级整洁的 for 循环,例如:

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

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

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

编辑

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

【讨论】:

  • 谢谢你,第二个代码部分帮助我解决了这个问题,但似乎第一个案例在使用智能指针的情况下是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多