将非静态函数绑定到回调时出现问题
Issue with binding non static function to callback
我无法将非静态成员函数绑定到回调。 我必须将test2
类成员函数here()
绑定到test1
成员callBack
这是一个std::function
,但我找不到这样做的方法。如果你有任何想法,任何人都可以建议我。
在代码中显示
#include <iostream>
#include <stdint.h>
#include <functional>
using namespace std;
class test1{
public:
typedef std::function<void()> callback_function_t;
callback_function_t callBack;
void setCallback(callback_function_t _callBackfn){
callBack = std::move(_callBackfn);
}
void check(void){
callBack();
}
};
class test2{
public:
void here(){
cout << "safsafsdf" << endl;
}
};
int main(){
test1 t1;
test2 t2;
t1.setCallback(t2.here); // Can't Works
return 0;
}
必须在 test1 回调中设置。
问题是,在创建std::function
时,您还必须提供必须调用成员函数的类的实例。另一个答案使用std::bind
,这是一个可能的解决方案。 为了提高可读性,我建议使用 lambda 函数作为替代方案:
t1.setCallback([&t2](){t2.here();});
请注意,此处捕获t2
作为引用,因此必须确保t1
使用回调时t2
处于活动状态。
或者,您可以按值捕获(制作副本(
t1.setCallback([t2]() mutable {t2.here();});
并且您需要mutable
关键字来允许调用非 const 限定成员函数
最后,您还可以在 lambda 内移动t2
,避免复制
t1.setCallback([t2 = std::move(t2)]() mutable {t2.here();});
这是通用捕获,可从 C++14 开始提供。在您的特定示例中,使用std::move
几乎不会产生任何区别,但一般来说,如果对象很复杂,这可能会有用。
用于将this
指针绑定到t1
的语法不正确。你不能简单地编写t2.here
来获得一个函数,当调用时,它本质上与t2.here()
相同。
一种可能的解决方案是通过std::bind()
绑定this
对象,例如
t1.setCallback(std::bind(&test2::here, t2));
但请记住,这会在最终存储在t2.callBack
中的函数对象内创建t2
的副本。对t2
的修改不会影响t1.callBack
。如果您确定t1
总是比t2
寿命长,您还可以创建引用
t1.setCallback(std::bind(&test2::here, std::ref(t2)));
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 德尔福在回调中出现 GUI 问题
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- 将非静态函数绑定到回调时出现问题
- C++中嵌套在另一个 LinkedList 中的 LinkedList 整数上的回调函数问题
- 在回调(CPXcutcallbackadd)中添加用户剪切后,如何编写问题公式(CPXwriteprob)
- 在 Python 中扩展的 C++ 类中的 Seg 错误回调问题
- 托管函数在非托管结构(C++、C#)中作为回调函数传递的问题
- C++:类和回调问题
- C++OOP注册回调函数(typedef问题)
- 这个回调有什么问题?
- GLUT回调方法问题
- GLUT回调函数的问题
- 从c++回调到JS的问题
- c++中的一个BST回调函数和函数指针问题
- 回调函数问题
- 窗口事件回调函数C++的问题