类似于java中的c++回调

c++ callbacks like in java

本文关键字:回调 c++ 中的 java 类似于      更新时间:2023-10-16

我想知道是否有一种方法可以像在java中一样在C++中实现回调?更具体地说:在将回调函数传递给另一个函数时直接定义回调函数

类似这样的东西:

int main(void) {
    ...
    myButton->addOnClickCallback(new myCallback(){
        // do some stuff.
    });
    return 0;
}

我在C++中没有发现类似的东西,所以我想知道这是否可能。为了方便起见,这将是很好的:)

您可以在上进一步使用C++11中的lambdas

myButton->addOnClickCallback([](){
   // do some stuff.
});

这是唯一直接的方法。

如果这不可用,在其他解决方案中,您可以传递指向函数的指针,该指针由&运算符获取(不是必需的),而不是new。其次,该函数必须在main:之外定义

myCallback() {
    // do some stuff.
}
int main (void) {
   myButton->addOnClickCallback(myCallback);
   return 0;
}

由于lambdas已经包含在另一个答案中,这里有另一个解决方案(实际上是Java的复制品):

#include <iostream>
struct Base {
  virtual void process() = 0;
};
void want_callback(Base& b) {
  b.process();
}
void foo() {
  struct X : Base {
    void process() {
      std::cout << "Processn";
    }
  } callback;
  want_callback(callback);
}

您也可以像Java那样做到这一点:需要与另一个类交互的类通过发布它希望合作者实现的接口来实现。该类通过调用回调接口上的方法来调用其协作器上的方法。

我认为lambdas是从C中概括函数指针,而不是回调。标准库使用简单的谓词作为其算法的参数,Lambda与这些算法配合得很好。当两个协作对象之间的来回通信变得更加复杂时,您必须传入多个Lambda:每个预期的交互都有一个Lambda。管理这堆lambda变得很麻烦,使用接口开始赢得理解性和可读性。

对于一个"fire-and-forget"的单一交互,并且回调的生命周期不会变得混乱,那么lambdas工作得很好。通过类实现接口,您可以更直接地控制任何依赖数据的生存期,并更直接地表达两个对象之间交互的性质。

Sergey在回答中的代码就是这种方法的例证。