在C++中,何时以及如何使用回调函数?
编辑:
我希望看到一个编写回调函数的简单示例。
在C++中,何时以及如何使用回调函数?
编辑:
我希望看到一个编写回调函数的简单示例。
@Pixelchemist已经给出了一个全面的答案。但作为一名Web开发人员,我可以提供一些提示。
通常我们使用tcp
来开发Web框架
,因此通常我们有一个结构:
TcpServer listen port and register the socket to epoll or something
-> TcpServer receive new connection
-> HttpConenction deal the data from the connection
-> HttpServer call Handler to deal with HttpConnection.
-> Handler contain codes like save into database and fetch from db
我们可以按照订单开发框架,但对于只想关心Handler
的用户来说并不友好。因此现在是使用callback
的时候了。
Mutiple Handler written by user
-> register the handler as callback property of HttpServer
-> register the related methods in HttpServer to HttpConnection
-> register the relate methods in HttpConnection to TcpServer
因此,用户只需要将其处理程序注册到httpserver(通常使用某些路径字符串作为键
),其他事情都是通用的框架可以完成。
因此,您可以发现我们可以将回调
视为一种上下文,我们希望委托给其他人代表我们执行。 核心是我们不知道何时调用函数最佳,但我们委托的人知道。
在寻找嵌入式系统的解决方案时,需要注意以下几点:
std::
库。boost::
库。static
分配。但是,仍然希望实现像 std::bind
或 std::function
这样的回调实现。
以下是一些有用的链接:
通过静态存储 lambda 表达式来替换 std::bind
- 如果您的回调参数存储在指定的内存位置中,则此方法非常有用。所有回调都将在没有参数的情况下被调用,例如,MyCallback()
,因此它们的类型相同,因为参数是“存储”在内部的。由于所有回调“看起来”相同,因此它们都可以轻松地放置在同一个数组中,并具有其操作码。链接:std::function with static allocation in c++
将 std::function
替换为 C 中的“函数指针”实现:(不支持绑定/lambda存储,可以使用上面的绑定):https://blog.coldflake.com/posts/C++-delegates-on-steroids/(有一些限制)或 https://www.etlcpp.com/(具有更多功能)
注意: 在 STM32 上运行