Lambda表达式转换
lambda expression conversion
我正在尝试将使用新标准(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 ;)
}
相关文章:
- "()"如何在C++中将语句转换为表达式?
- 静态强制转换内的表达式
- 如何将Javascript正则表达式转换为C++11正则表达式
- 表达式模板玩具示例:用户定义的强制转换不适用于复杂类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- 如何将 xt::sum 表达式结果转换为整数
- 使用向量将给定表达式转换为波兰表示法时出现运行时错误
- 转换的常量表达式措辞
- 将返回表达式隐式转换为布尔值
- 如何使用 ASCII 转换使用字符堆栈计算后缀表达式
- 表达式到C++类类型转换器/类型转换
- MISRA 警告<复杂表达式隐式转换为不同的基本类型>
- 如何使用 cpp 将 z3 表达式转换为字符串
- 如何将表达式转换为变量
- 缩小从"int"(常量表达式)到"无符号int"的转换 - MSVC vs gc
- 非常量表达式的左值到右值转换的结果是常数吗?
- 转换特征矩阵类型时,错误:在"float"之前预期主表达式
- C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式
- spoj:ONP-转换表达式
- 复杂的 C 样式类型转换表达式的工作原理