C++中的回调函数

431

在C++中,何时以及如何使用回调函数?

编辑:
我希望看到一个编写回调函数的简单示例。


3
这篇文章很好地解释了回调函数的基础知识,易于理解其概念。 - Anurag Singh
12个回答

0

@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(通常使用某些路径字符串作为键),其他事情都是通用的框架可以完成。

因此,您可以发现我们可以将回调视为一种上下文,我们希望委托给其他人代表我们执行。 核心是我们不知道何时调用函数最佳,但我们委托的人知道。


0

在寻找嵌入式系统的解决方案时,需要注意以下几点:

  1. 由于安全、大小或堆分配等原因,无法使用 std:: 库。
  2. 无法使用 boost:: 库。
  3. 必须仅使用 static 分配。

但是,仍然希望实现像 std::bindstd::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 上运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接