回调函数存在形式及几个基本元素:
存在一种情况, 比如一个进程内容需要维持某种状态,然后等待外面的输入来改变当时的状态,不同的输入需要切换到不同的状态
此种情况下可以使用回调机制。
基本元素:
1 注册回调函数,存在一个保存回调函数的结构,可通过对回调函数标识,比如直接使用函数地址,或者通过一字符或者枚举值映射回调函数。
2 查找回调函数,或者说定位回调函数,通过回调函数标识对回调函数定位,通常是一种对保存回调函数结构的一种解析方法。
3 调用回调函数,定位到回调函数之后调用回调函数。
按照上述即可实现基本回调机制,下面一段c++的代码示例,c++回调函数主要是通过函数指针的形式实现回调。基本要求理解函数指针。
#include <iostream>
#include <map>
#include <string>
using namespace std;
//函数指针
typedef void(*FunNormal)();
//保存回调函数的结构,通过字符串映射回调函数地址。
std::map<string, FunNormal> regFunMap;
//查找回调函数,
void invokeToMethod(string name)
{
std::map<string, FunNormal>::iterator iter;
iter = regFunMap.find(name);
if(iter != regFunMap.end())
{
//cout << "name\n";
FunNormal funAddres = iter->second;
//查到到的直接是函数地址,直接通过函数地址调用回调函数
funAddres();
}
cout << "can not invoke to Method\n";
}
//注册回调函数,通过字符串映射回调函数地址
void regListenFun(string name, FunNormal funAddress)
{
regFunMap.insert(std::make_pair(name, funAddress));
}
//测试函数,测试函数地址调用方法是否可用
void regTest(string name, FunNormal p)
{
cout << name << "\n";
p();
}
//回调函数fun1
void fun1()
{
// printf("fun1()\n");
cout << "fun1\n";
}
//回调函数fun2
void fun2()
{
//printf("fun2()\n");
cout << "fun2\n";
}
int main()
{
regListenFun("fun1", fun1);
regListenFun("fun2", fun2);
while(true)
{
cout << "input fun" << std::endl;
string inputStr;
cin >> inputStr;
if(inputStr == "quit")
break;
invokeToMethod(inputStr);
}
return 0;
}