c++回调函数

在项目中看到回调函数,总结一下:
回调函数的几个条件:

  1. 定义一个指向函数的指针
  2. 声明被回调函数
  3. 调用回调函数的宿主函数

本例子将回调函数注册到一个map中,在消息类触发的服务器应用中常见,比如游戏服务器

话不多说:直接上代码
版本1:定义一个指向函数的指针

CallBack.h

#ifndef __CALLBACK_H__
#define __CALLBACK_H__

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

typedef std::map<string, unsigned int> FuncMap;
typedef std::map<string, unsigned int>::iterator IterFuncMap;

typedef void (*Hook)(int, int); //函数指针

class CallBack
{
	public:
		CallBack();
		virtual ~CallBack();
   
		void Init();
		void RegisterCallBackFunc(std::string key, Hook hookfun);//注册回调函数
		void CallBackFunc(string, int, int);//调用回调函数
		static void add(int a, int b);  //这里必须定义为static,因为FuncMap的value为unsigned int
		static void sub(int a, int b);

	private:
		//std::map<std::string, unsigned int> func_map;
		FuncMap func_map;
};

#endif // !__CALLBACK_H__

CallBack.cpp

#include "CallBack.h"

CallBack::CallBack()
{
	Init();
}

CallBack::~CallBack()
{
	func_map.clear();
}

void CallBack::Init()
{
	//RegisterCallBackFunc("add", add);
	//这里用了两种方法将回调函数插入map
	RegisterCallBackFunc("sub", sub);  //法1
	func_map.insert(FuncMap::value_type("add",(unsigned int)CallBack::add));//法2
	cout << "initializer finish !" << endl;
}
void CallBack::add(int a, int b)
{
	int res = a + b;
	cout << "add res = " << res << endl;
}

void CallBack::sub(int a, int b)
{
	int res = a > b ? a - b : b - a;
	cout << "sub res = " << res << endl;
}

void CallBack::RegisterCallBackFunc(std::string key, Hook hookfun)
{
	auto iter = func_map.find(key);
	if (iter == func_map.end())
	{
		func_map.insert(FuncMap::value_type(key,(unsigned int)hookfun));
	}
}

void CallBack::CallBackFunc(string key, int a, int b)
{
	auto iter = func_map.find(key);
	if (iter != func_map.end())
	{
		Hook func = (Hook)iter->second;
		func(a, b);
	}
}

版本2:用c++11 的function代替函数指针

CallBack.h

#define __CALLBACK_H__

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

typedef std::function<void(int, int)> Func;
typedef std::map<string, Func> FuncMap;
typedef std::map<string, Func>::iterator IterFuncMap;

//typedef void (*Hook)(int, int);

class CallBack
{
	public:
		CallBack();
		virtual ~CallBack();
   
		void Init();
		void RegisterCallBackFunc(std::string key, Func func);
		void CallBackFunc(string, int, int);
		static void add(int a, int b);
		static void sub(int a, int b);

	private:
		//std::map<std::string, unsigned int> func_map;
		FuncMap func_map;
};

#endif // !__CALLBACK_H__

CallBack.cpp

#include "CallBack.h"

CallBack::CallBack()
{
	Init();
}

CallBack::~CallBack()
{
	func_map.clear();
}

void CallBack::Init()
{
	RegisterCallBackFunc("add", add);
	RegisterCallBackFunc("sub", sub);
	//func_map.insert(FuncMap::value_type("add",(unsigned int)CallBack::add));
	cout << "initializer finish !" << endl;
}
void CallBack::add(int a, int b)
{
	int res = a + b;
	cout << "add res = " << res << endl;
}

void CallBack::sub(int a, int b)
{
	int res = a > b ? a - b : b - a;
	cout << "sub res = " << res << endl;
}

void CallBack::RegisterCallBackFunc(std::string key, Func func)
{
	auto iter = func_map.find(key);
	if (iter == func_map.end())
	{
		func_map.insert(make_pair(key,func));
	}
}

void CallBack::CallBackFunc(string key, int a, int b)
{
	auto iter = func_map.find(key);
	if (iter != func_map.end())
	{
		Func func = iter->second;
		func(a, b);
	}
}

main.cpp

#include "CallBack.h"
using namespace std;

int main()
{
    CallBack call;
    int a = 20, b = 10;

    call.CallBackFunc("add", a, b);
    call.CallBackFunc("sub", a, b);
    system("pause");
    return 0;
}

两种版本的最大差别就是FuncMap的value不同,一个是unsidned int ,一个是 std::function<void(int, int)>,第二种编译器必须支持c++11特性

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值