我可以将 C++11 lambda 与 libevent 一起使用吗?

Posted

技术标签:

【中文标题】我可以将 C++11 lambda 与 libevent 一起使用吗?【英文标题】:Can I use C++11 lambda with libevent? 【发布时间】:2018-11-22 09:37:53 【问题描述】:

在libevent中有一个回调函数类型被event_new()使用。

typedef void (*event_callback_fn)(evutil_socket_t, short, void *);

我想将 lambda 与 event_callback_fn 一起使用。

如果我使用

[](evutil_socket_t fd, short flags, void * _param)

一切正常。 但是如果我使用 lambda 捕获列表

[&](evutil_socket_t fd, short flags, void * _param) 

event_new() 不会被编译。

【问题讨论】:

只有无捕获的 lambda 可以转换为指向函数的指针。如果您需要捕获,那么您需要以其他方式解决它。 简短回答是否定的。您应该了解closures 和callbacks 是什么。但是,您可以将闭包作为 void * 客户端数据传递 @Basile Starynkevitch, 所以 event_new(_base, -1, EV_TIMEOUT, [](evutil_socket_t fd, short flags, void * _param) , []());像这样?还是编译错误 【参考方案1】:

类型别名

void (*event_callback_fn)(evutil_socket_t, short, void *);

是一个函数指针。当 Lambda 没有捕获任何内容时,它们可以自动转换为函数指针。一旦定义了闭包(有状态 lambda),就不能将其作为 event_callback_fn 类型的参数传递。

【讨论】:

以上是关于我可以将 C++11 lambda 与 libevent 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

编译时如何将libevent与gcc静态链接?

带有 C++11+ unique_ptr 的 Libevent

C ++ 11 lambda作为成员变量?

Lambda 函数与表达式

无法将 LIBEVENT 链接为 C++

我可以将 curl_multi/multi_socket 与 libevent 一起使用吗