您可以在没有 std::function 的情况下将 lambda 作为参数传递吗

ITD*_*TDW 1 c++ lambda

std::function我需要将带有捕获的 lambda 传递给函数,但由于性能缓慢,我试图避免使用,并且我正在制作一个性能关键的应用程序。我也不想使用模板,因为返回类型和参数是特定的,但如果这是唯一的方法,我可以使用模板。

我已经尝试过 ChatGPT 的答案,但没有成功:

void my_func(void (*callback)(int, int, int))
{
    callback(1, 2, 3);
}

int main()
{
    int x = 10;

    my_func([&](int a, int b, int c)
    {
        std::cout << "Example, a + b + c + x: " << a + b + c + x << std::endl;
    });

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误说:

不存在从“lambda [](int a, int b, int c)->void”到“void (*)(int, int, int)”的合适转换函数

sel*_*bie 7

您可以将 lambda 作为函数指针传递 - 但前提是不涉及捕获。

这有效:

void my_func(void (*callback)(int, int, int)) {
    callback(1, 2, 3);
}

int main() {
    my_func([](int a, int b, int c) {
        int x = 10;
        std::cout << "Example, a + b + c + x: " << a + b + c + x << std::endl;
    });

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

x上面的例子中也可以声明为全局的。

int x;

int main()
{
    x = 10;

    my_func([](int a, int b, int c) {
        std::cout << "Example, a + b + c + x: " << a + b + c + x << std::endl;
    });

    return 0;
}

Run Code Online (Sandbox Code Playgroud)