- 使用静态成员函数:
- 理解:静态成员函数没有
this
指针,这样可以符合回调函数的常规形式。通过静态成员函数间接调用非静态成员函数来实现所需功能,在静态成员函数中可以通过传递类对象指针来操作对象的非静态成员。
- 示例:
#include <iostream>
class MyClass {
public:
int data;
MyClass(int d) : data(d) {}
static void callbackStatic(MyClass* obj) {
obj->nonStaticCallback();
}
void nonStaticCallback() {
std::cout << "Data in non - static callback: " << data << std::endl;
}
};
void generalCallback(void (*func)(MyClass*)) {
MyClass obj(10);
func(&obj);
}
int main() {
generalCallback(MyClass::callbackStatic);
return 0;
}
- 使用
std::function
和 std::bind
:
- 理解:
std::bind
可以将类成员函数与对象实例绑定,生成一个可调用对象,std::function
可以存储这个可调用对象。这样就可以将其作为回调函数使用,它会自动处理 this
指针。
- 示例:
#include <iostream>
#include <functional>
class MyClass {
public:
int data;
MyClass(int d) : data(d) {}
void callback() {
std::cout << "Data in callback: " << data << std::endl;
}
};
void generalCallback(std::function<void()> func) {
func();
}
int main() {
MyClass obj(20);
std::function<void()> boundFunc = std::bind(&MyClass::callback, &obj);
generalCallback(boundFunc);
return 0;
}
- 使用Lambda表达式:
- 理解:Lambda表达式可以捕获对象实例,从而隐式处理
this
指针。捕获后生成的可调用对象可以作为回调函数使用。
- 示例:
#include <iostream>
#include <functional>
class MyClass {
public:
int data;
MyClass(int d) : data(d) {}
void callback() {
std::cout << "Data in callback: " << data << std::endl;
}
};
void generalCallback(std::function<void()> func) {
func();
}
int main() {
MyClass obj(30);
generalCallback([&obj]() { obj.callback(); });
return 0;
}