【问题标题】:Why use Call Back instead of directly calling the function? [closed]为什么要使用 Call Back 而不是直接调用函数呢? [关闭]
【发布时间】:2017-08-02 18:55:50
【问题描述】:

在浏览这篇CallBack Function 文章/代码时(标题为一个简单的回调函数),我发现回调只不过是简单的函数调用,那么为什么不简单地调用该函数而不是调用它通过作为参数传递的函数指针?如果我理解有误,请告诉我。这个问题是基于对概念的初步学习,寻求一些简单的澄清。

【问题讨论】:

  • 有时你不知道要提前调用的函数的名称。
  • @AndyG 你能解释一下或发布一些链接吗?谢谢
  • 请为您的问题提供更多背景信息。有很多地方回调是有意义的。提供一个示例,说明您认为使用回调比仅调用函数更有意义的地方。回调的主要用例是解决异步问题。
  • 依赖注入
  • @Gaurav:你基本上是在问“这个功能有什么用”。嗯,答案是“很多东西”。 C 和 C++ 中的回调有很多用途。这些用途中没有一个比其他任何用途都更正确。这就像在问“添加整数有什么用?”

标签: c++ callback function-pointers


【解决方案1】:

虽然问题是用 C++ 标记的,但我能想到的最简单的回调示例来自 C。它是一个 C 风格的 qsort 函数。

想象一下你自己实现了一个数组排序函数。您希望该函数能够采用任何类型和任何大小的数组。那么,这样一个函数的参数是什么?首先,您需要知道数组的开始。其次,您需要知道数组的大小。第三,您需要知道数组中单个元素的大小。第四,考虑到元素,你的qsort 需要知道一个是否比另一个大!为您的通用函数知道这一点的唯一方法是调用其他函数,但哪个函数?您必须接受指向此比较函数的指针作为参数,并在每次需要比较两个元素时调用它。这样的比较函数就是回调。

【讨论】:

  • 和往常一样,可敬的否决者能否解释一下否决票背后的原因?
  • 我不知道为什么,但可能是因为你提到了 C,而不是 C++(你的第一句话)。但是您始终可以使用std::qsort 并删除该段落(我怀疑这可能会绊倒人们)。
  • @Rakete1111 当然,他们有权投票,但我不同意。我使用qsort 作为一个简单且通常熟悉的概念,它表明需要回调函数。如果有人看不到 C 之外的东西......好吧,我不会和他们争论。
  • 是的,我也觉得很奇怪。总是评论人们,否则没有人能够改进:P
【解决方案2】:

有时您可能会传递需要存储和稍后调用的函数(或函数对象/lambda)。有时,回调在调用之前需要通过多层函数。有时它需要存储在一个容器中(如std::map),并且只在很久以后才被不知道你放入容器中的代码调用。

许多很好的理由说明为什么 callbacs 不能只是一个预先声明的函数的简单静态调用。在编写调用它的代码时,您甚至可能不知道 this 指针(例如)。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2011-08-21
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2011-12-11
    • 2012-08-30
    相关资源
    最近更新 更多