如何使用函数指针(没有自动)声明 lambda?
How declare lambda with function pointers (without auto)?
我可以在没有 auto
的情况下轻松声明匿名函数(它们与 lambda 相同,但没有 "context" - [...]
):
#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;
}
你不能。
闭包的类型是唯一的、未命名的类型。您的第一个示例之所以有效,是因为如果闭包类型不捕获任何内容,则闭包类型具有到 pointer-to-function 的转换函数,而不是因为闭包 是 a void (*) (char)
.
您最好坚持使用 auto
,因为 std::function
可能会有额外的类型擦除开销。
auto
作为参数是 GCC 和其他人提供的扩展。你可以做的是使用模板:
template<typename T>
int callFoo(T funct, int x) {
return funct(x+1);
}
我可以在没有 auto
的情况下轻松声明匿名函数(它们与 lambda 相同,但没有 "context" - [...]
):
#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;
}
你不能。
闭包的类型是唯一的、未命名的类型。您的第一个示例之所以有效,是因为如果闭包类型不捕获任何内容,则闭包类型具有到 pointer-to-function 的转换函数,而不是因为闭包 是 a void (*) (char)
.
您最好坚持使用 auto
,因为 std::function
可能会有额外的类型擦除开销。
auto
作为参数是 GCC 和其他人提供的扩展。你可以做的是使用模板:
template<typename T>
int callFoo(T funct, int x) {
return funct(x+1);
}