Ruby块,C++中的java闭包

Jor*_*rdi 3 c++ closures iterator stl

我正在开发一个程序,我发现自己这样做了很多:

void Model::SetCollideMode( const std::string &m )
{
  Body *body;

  std::map<std::string, Body* >::iterator iter;

  for (iter=this->bodies.begin(); iter!=this->bodies.end(); iter++)
  {
    body = iter->second;

    body->SetCollideMode( m );
  }
}
Run Code Online (Sandbox Code Playgroud)

我在几个对象中有几个方法,基本上将属性应用于其所有子节点.来自Ruby世界我很想做类似的事情:

for_all_bodies{ body->SetCollideMode(m) }
Run Code Online (Sandbox Code Playgroud)

无论如何,要使这个代码更像闭包或以其他方式改进它?

我意识到C++是如何工作的,它是基于堆栈的,并且没有上下文信息来创建一个完美的闭包函数(这需要一个VM?)但至少要改进当前重复这段代码的100次编程.

Dan*_*ker 5

在C++ 0x中,是的.看这里.正如您所猜测的那样,它们是以特有的C++方式完成的,即如果您不小心关闭堆栈变量然后让lambda对象比堆栈存活更长时间,那么您有未定义的行为.这是让程序崩溃的全新方式!但这是不公平的 - 在很多方面它们比许多其他语言中的lambdas更复杂,因为你可以声明允许它们改变状态的程度.

在那之前,有人试图模仿同样的事情,但他们可能比他们的价值更麻烦.