我正在尝试将使用新标准(C ++ 0x)编写的函数转换回以前的标准
如何转换以下行
typedef std::vector<value3 const*> passmem;
pasmem pm; // neighborhood sequence
std::for_each(pm.begin(), pm.end(), [&] (value3 const* x)
答案 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 ;)
}