【发布时间】:2016-01-04 14:19:07
【问题描述】:
我可以在没有auto 的情况下轻松声明匿名函数(它们与 lambda 相同,但没有“上下文”-[...]):
#include <iostream>
using namespace ::std;
void foo(void (*f)(char))
{
f('r');
}
int main()
{
void (*anon)(char) = [](char c) -> void { cout << c << endl; };
foo(anon);
return 0;
}
但是如何声明 lambda 呢?这是唯一可能的方法吗? (也许使用 typedef)。这里我使用::std::function,但我没有在 foo 参数中的某处提到 f 的上下文...:
#include <iostream>
#include <functional>
using namespace ::std;
//int foo(auto f, char x) // !only since c++14
int foo(function<int(char)> f, char x)
{
return f(x+1);
}
int main()
{
int a = 5, b = 10;
//void (*lambda)(char) = [](char c) { cout << c << endl; };
//auto sample_lambda = [&a,b](char c) -> int // !only since c++11
function<int(char)> sample_lambda = [&a,b](char c) -> int
{
for (;a<b;a++)
cout << a << c << endl;
return (int)c+a;
};
foo(sample_lambda, 's');
return 0;
}
【问题讨论】:
-
将 foo 定义为模板函数。
template<class Function> void foo(Function&& f) { f('r'); } -
“声明一个 lambda”没有意义。 lambda 是 表达式 的一种类型,您不能删除表达式,就像“声明一个总和”或“声明一个函数调用”一样。
-
非捕获 lambda 表达式可以衰减为指向函数的指针,但它不是指向函数的指针。
标签: c++ pointers lambda anonymous-function auto