Lambda表达式转换

lambda expression conversion

本文关键字:转换 表达式 Lambda      更新时间:2023-10-16

我正在尝试将使用新标准(c++ 0x)编写的函数转换回以前的标准

如何转换以下行

typedef std::vector<value3 const*> passmem;
pasmem pm; // neighborhood sequence
 std::for_each(pm.begin(), pm.end(), [&] (value3 const* x)

只需将lambda表达式转换为命名函数并将其作为参数传递给for_each。或者,只需将lambda函数的函数内联,如:

   for (pasmem::iterator it=pm.begin(); it != pm.end(); ++it) {
      // Do the lambda functionality with *it
   }
for(passmem::const_iterator i = pm.begin(); i != pm.end(); ++i)
{
   const value3* x = *i;
   // same as in lambda
}

处理lambda的基本规则需要创建一个函数对象,该函数对象提供与lambda相同签名的operator()。对于捕获的每个字段,都需要向函子添加一个成员,并在构造中初始化它。在你的特殊情况下,这将是引用const引用,这取决于你的lambda被定义的位置和涉及的类型。

如果,对于非平凡,lambda将向量中每个元素的值累加到一个局部变量中,并且(假设value3有适当的操作符):

struct accumulator__ {
    value3 & v_;
    accumulator__( value3 & v ) : v_(v) {}
    void                                   // for_each ignores the return value
    operator()( value3 const * p ) {       // same argument as lambda
       v_ += *p;
    }
};

如果lambda被定义为一个成员函数,并且它访问了类的任何成员,那么事情就会变得有点棘手,但是你基本上必须手动创建闭包所有访问的字段(即添加所有访问的成员的[const]引用)。真正的lambda(我相信)只捕获this,但在重构您

首先,@george272有解决方案(尽管我将调用迭代器(c)it而不是i)。

回到你的原始代码,你不应该(几乎)在c++ 11中使用for_each

原因:

typedef std::vector<value3 const*> passmem;
pasmem pm; // neighborhood sequence
for(auto x : pm)
{ 
  // do your stuff as normal but with less typing ;)
}