因为需要this指针,操作系统无法直接调用C++的类成员函数,这时就需要将类成员函数做一些封装。首先引入functional头文件,使用function<>模板定义C形式的函数指针类型,然后创建一个全局的调用字典,键必须是能被区别调用方的数据类型(如控件句柄等),编写一个静态的回调函数,在回调函数内查找字典的函数指针并调用。类实例创建后,创建lambda表达式,并在内调用类成员函数,然后将lambda与类的识别标识加入全局调用字典。注意:在类被释放时一定要清除字典的回调指针。具体代码如下:

#include <functional>
#include <iostream>
using namespace std;

//回调函数别名
typedef function<void(long)> cb_func;

//定义你的类
class Class1 {
private:

public:
	int id;//实例标识ID
	//回调函数
	void Callback(long i) {
		cout << "回调函数被调用" << endl;
	}
};

//函数指针字典
map<int, cb_func> *cb_funcs;

//静态回调函数,必须要有一个可以用于区别调用方的参数
static void StaticCallBack(int id, long i)
{
	if (cb_funcs->count(id))
	{//判断键是否在字典中
		auto it = cb_funcs->find(id);
		if (it != cb_funcs->end())
		{//获取值
			cb_func cb = it->second;
			cb(i);
		}
	}
	else 
	{
		cout << "没有找到回调函数" << endl;
	}
}

int main()
{
	cb_funcs = new map<int, cb_func>();//初始化字典

	//创建类实例
	Class1* c = new Class1();
	c->id = 1;

	//拉姆达表达式 捕获动态的对象指针 c,并在回调函数中调用了对象 Class 的 Callback 成员函数。
	auto cb = [c](long i) 
	{
		c->Callback(i);
	};

	//添加函数到列表
	cb_funcs->insert(pair<int, cb_func>(c->id, cb));

	//尝试调用
	StaticCallBack(1, 16);//回调函数被调用
	StaticCallBack(2, 32);//没有找到回调函数

	delete c;//释放对象
	return 0;
}

当然,更简单的方法是可以用值为类实例的字典,不过这样做会限制全局字典的类型,有利有弊。代码如下:

#include <functional>
#include <iostream>
#include <map>
using namespace std;

//定义你的类
class Class1 {
public:
	//实例标识ID
	int id;
	//回调函数
	void Callback(long i) {
		cout << "回调函数被调用" << endl;
	}
};

//类实例指针字典
map<int, Class1*> *cb_funcs;

//静态回调函数,必须要有一个可以用于区别调用方的参数
static void StaticCallBack(int id, long i)
{
	if (cb_funcs->count(id))
	{//判断键是否在字典中
		auto it = cb_funcs->find(id);
		if (it != cb_funcs->end())
		{//获取值
			Class1* c = it->second;
			c->Callback(i);
		}
	}
	else
	{
		cout << "没有找到回调函数" << endl;
	}
}

int main()
{
	cb_funcs = new map<int, Class1*>();//初始化字典									   
	Class1* c = new Class1();//创建类实例
	c->id = 1;
	//添加类实例到列表
	cb_funcs->insert(pair<int, Class1*>(c->id, c));
	//尝试调用
	StaticCallBack(1, 16);//回调函数被调用
	StaticCallBack(2, 32);//没有找到回调函数
	delete c;//释放对象
	return 0;
}