【问题标题】:Type conversion for lambda C++lambda C++ 的类型转换
【发布时间】:2017-09-18 18:06:57
【问题描述】:
是否可以将 lambda 函数作为某种类型的函数传递?
例如,我有
typedef double(*Function)(int, double);
如何将 lambda 函数转换为类型?
【问题讨论】:
标签:
c++
function
lambda
type-conversion
【解决方案1】:
对于无状态 lambda,此转换是隐式可用的:
Function f = [](int, double) -> double {};
如果只想转换 lambda 表达式本身,可以使用一元 + 运算符来实现:
auto* p = +[](int, double) -> double {}; // p is of type double(*)(int, double)
带有捕获的 lambda 不提供此类转换,因为它在语义上不等同于(无状态)函数(这甚至适用于最终不捕获任何内容的默认捕获的情况)。
【解决方案2】:
您可以使用std::function 代替普通函数指针。这将允许保留 lambda,即使它们有捕获:
#include <iostream>
#include <functional>
typedef std::function<double(int, double)> Function;
int main()
{
Function f;
int i = 4;
f = [=](int l, double d){ return i*l*d; };
std::cout << f(2, 3);
}
[Live Demo]