C++:Lambda 到函数指针转换的用例是什么?

C++: What is the use case of Lambda to function pointer conversion?

您可以将 Lambda 转换为函数指针。这有哪些实际用例?我们为什么需要这个?

Play with it

int main() {
    auto test = []() -> int { return 1; };
    using func_point = int (*)();
    func_point fp = test;
    return test();
}

函数指针的替代方法是 std::function 和模板参数/通用仿函数。所有这些都会以不同的方式影响您的代码。

您可以将 lambda 传递给需要 std::function、通用仿函数或函数指针的代码。在调用代码中有一个概念可以如此一致地支持所有这些不同的接口概念是很方便的,毕竟,方便就是一切,lambda 就是这样。

只是为了使这个完整:

  • 函数指针是上述概念中最不通用的概念,因此并非每个 lambda 都可以变成函数指针。捕获子句必须为空。
  • 如果可能,用 + 为 lambda 前缀明确地将它们转换为函数指针,即在以下代码段中,f 具有类型 int (*)( int )auto f = +[]( int x ) { return x; };

首先,您只能转换带有空闭包的 lambda。这样的 lambdas 实际上是无状态的,这使得转换成为可能。

至于用例,一个重要的用例是与 C 的集成。有很多 C API 允许注册用户回调,通常采用一个或多个参数,如下所示:

// Registers callback to be called with the specified state pointer
void register_callback(void (*callback)(void* state), void* state);

您可以将状态与 C++ class 实例相关联并将回调调用转换为方法调用:

class Foo
{
public:
    void method();
};

Foo foo;
register_callback([](void* p) { static_cast< Foo* >(p)->method(); }, &foo);