如何使用函数指针(没有自动)声明 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);
}