lambda表达式转换

时间:2011-07-25 05:53:58

标签: c++

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

如何转换以下行

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

4 个答案:

答案 0 :(得分:4)

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

   for (pasmem::iterator it=pm.begin(); it != pm.end(); ++it) {
      // Do the lambda functionality with *it
   }

答案 1 :(得分:1)

for(passmem::const_iterator i = pm.begin(); i != pm.end(); ++i)
{
   const value3* x = *i;
   // same as in lambda
}

答案 2 :(得分:1)

处理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]所有被访问成员的引用。真正的lambdas(我相信)只捕获this但在重构中你 可能会失去对班级成员的访问权限。

答案 3 :(得分:0)

首先,@ 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 ;)
}