类似于java中的c++回调
c++ callbacks like in java
我想知道是否有一种方法可以像在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在回答中的代码就是这种方法的例证。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数