C++ Weekly - Episode 132 脱水版: Lambda In Fold Expression
折叠表达式中的 Lambda
作者展示了一个很有意思的例子. 对于一个折叠表达式展开的例子, 如下:
template<typename ... T>
auto do_staff(T ... t)
{
return ( t + ... );
}
int main()
{
return do_staff(1, 2, 3, 4, 5); // return 15
}
编译器返回了正确的计算结果. 我们还可以改写成 lambda 的形式, 如下:
template<typename ... T>
auto do_staff(T ... t)
{
return ( [t](){ return t; }() + ... );
}
int main()
{
return do_staff(1, 2, 3, 4, 5);
}
编译器也能正确计算. lambda 的调用相当于捕获了当前值, 然后返回. 类似于如下折叠展开:
return ( [t0](){ return t0; }() + [t1](){ return t1; }() + ... );
这个例子只是很有趣, 可能并没有实际的意义. 假如需要对捕获的当前值做一些操作或者检查, 这种 lambda 似乎有点用处, 比如可以:
template<typename ... T>
auto do_staff(T ... t)
{
return ( [t](){ return t + 3; }() + ... );
}
int main()
{
return do_staff(1, 2, 3, 4, 5);
}
我们可以通过 lambda 来对捕获的值做一些下个要的操作.