我想转换为使用新标准(C++ 0x中)编写的函数返回到以前的标准lambda表达式转换
我如何转换以下行
typedef std::vector<value3 const*> passmem;
pasmem pm; // neighborhood sequence
std::for_each(pm.begin(), pm.end(), [&] (value3 const* x)
我想转换为使用新标准(C++ 0x中)编写的函数返回到以前的标准lambda表达式转换
我如何转换以下行
typedef std::vector<value3 const*> passmem;
pasmem pm; // neighborhood sequence
std::for_each(pm.begin(), pm.end(), [&] (value3 const* x)
只是lambda表达式转换成命名函数并将其作为参数传递给for_each。或者只是做你的拉姆达内联函数等的功能:
for (pasmem::iterator it=pm.begin(); it != pm.end(); ++it) {
// Do the lambda functionality with *it
}
我想你的意思是'it!= pm.end();'而不是'* it!= pm.end()'。 '++它'也被广泛认为是很好的一般实践 - 对于某些迭代器可以更有效率,但很少有实际意义上的差异。 –
'pm'表示一个实例,你不能从一个实例中提取一个类型成员,而是需要类型(或者一个typedef别名):'for(passmem :: iterator it = pm.begin()...' –
你对了,我修好了。 –
for(passmem::const_iterator i = pm.begin(); i != pm.end(); ++i)
{
const value3* x = *i;
// same as in lambda
}
处理拉姆达的基本规则需要创建一个函数对象,提供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
,但在重构中你 可能会失去对班级成员的访问权限。
起初,@ 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 ;)
}
你的问题似乎缺少一些代码。 –
以及你想要代码转换为什么的描述。 –
您应该添加函数的主体,取决于函数的主体是什么,生成的代码可能会有所不同。 –