2011-07-25 152 views
2

我想转换为使用新标准(C++ 0x中)编写的函数返回到以前的标准lambda表达式转换

我如何转换以下行

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

你的问题似乎缺少一些代码。 –

+1

以及你想要代码转换为什么的描述。 –

+0

您应该添加函数的主体,取决于函数的主体是什么,生成的代码可能会有所不同。 –

回答

4

只是lambda表达式转换成命名函数并将其作为参数传递给for_each。或者只是做你的拉姆达内联函数等的功能:

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

我想你的意思是'it!= pm.end();'而不是'* it!= pm.end()'。 '++它'也被广泛认为是很好的一般实践 -​​ 对于某些迭代器可以更有效率,但很少有实际意义上的差异。 –

+1

'pm'表示一个实例,你不能从一个实例中提取一个类型成员,而是需要类型(或者一个typedef别名):'for(passmem :: iterator it = pm.begin()...' –

+0

你对了,我修好了。 –

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

处理拉姆达的基本规则需要创建一个函数对象,提供operator()具有相同签名的拉姆达。对于每个捕获的字段,您都需要向仿函数中添加一个成员,并在构造中初始化它。在你的特定情况下,将由参考const参考,这取决于你的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; 
    } 
}; 

如果拉姆达被定义为一个成员函数,并且它访问了该类的任何成员,那么事情会变得有点棘手,但你基本上必须手动创建所有访问的字段的闭合(即添加[const]引用所有访问的成员。真正的lambda(我相信)只捕获this,但在重构中你 可能会失去对班级成员的访问权限。

0

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

再回到您的原代码,你不应该(几乎)用不完的for_each在C++ 11

这是为什么:

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