什么是回调?它是什么以及如何在例如C++中实现它

Tom*_*ter 10 c++ managed-c++ callback

我意识到这是一个新手问题,但是当我正在努力学习C++时,我经常对这个表达式"回调"感到困惑.我用Google搜索并检查了维基百科,但没有找到一个好的探索.我熟悉一些Java和C#,但听起来不太可能,我从来没有真正理解回调意味着什么.

如果有人知道如何向一个简单的外行解释这个术语,我会非常感激.

Mar*_*ett 16

我熟悉一些Java和C#

回调是在那些语言事件或委托-得到的方式通过别人的代码运行代码在它的上下文.因此,术语"回调":

  1. 你打电话给其他一些代码
  2. 它运行,也许计算一个中间值
  3. 它会回调您的代码,也许会给您中间值
  4. 它继续运行,最终通过完成将控制权交还给你

规范示例是具有用户定义的比较函数(回调)的排序例程.给定一个排序例程,例如:

void Sort(void* values, int length, int valueSize, 
          int (*compare)(const void*, const void*) 
{
   for (int i = 0; i < length; i = i + 2) {
      // call the callback to determine order
      int isHigher = compare(values[i], values[i + 1]);
      /* Sort */
   }
}
Run Code Online (Sandbox Code Playgroud)

(如何执行排序的细节并不重要 - 只关注任何排序算法需要比较2个值并确定哪个更高的事实.)

那么,现在我们可以定义一些比较函数:

int CompareInts(const void* o, const void* p) {
   int* a = (int*) o;
   int* b = (int*) p;

   if (a == b) return 0;
   return (a < b) ? -1 : 1;
}

int ComparePersons(const void* o, const void* p) {
   Person* a = (Person*) o;
   Person* b = (Person*) p;

   if (a == b) return 0;
   return (a->Value() < b=>Value()) ? -1 : 1;
}
Run Code Online (Sandbox Code Playgroud)

并重用与它们相同的排序功能:

int intValues[10];
Person personValues[10];

Sort(intValues, 10, sizeof(intVaues[0]), CompareInts);
Sort(personValues, 10, sizeof(personVaues[0]), ComparePersons);
Run Code Online (Sandbox Code Playgroud)

如果您使用成员函数,事情会变得更复杂,因为您必须管理this指针 - 但概念是相同的.与大多数事情一样,首先在C中解释它们更容易.;)


cha*_*aos 5

当你发送回调函数时,你会发送一种寻址函数的方法(例如,C++中的函数指针),这样你发送它的代码可以在以后完成某个进程时调用该函数.

和...之间的不同

start_some_process(some_value, some_function())   # not using a callback
Run Code Online (Sandbox Code Playgroud)

start_some_process(some_value, some_function)     # using a callback
Run Code Online (Sandbox Code Playgroud)

在第一个实例中,您正在发送函数的结果,而在第二个实例中,您正在发送函数本身.