C++ Weekly - Episode 132 脱水版: Lambda In Fold Expression

68 阅读1分钟

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 来对捕获的值做一些下个要的操作.