管理不同类型的回调函数

来源:互联网 发布:矩阵加一列 秩不变 编辑:程序博客网 时间:2024/06/05 08:14

当有多个不同参数的回调函数需要管理时我们怎么办呢?它们并不能存放在同一个数组或者容器里面。

首先,我们可以定义一个抽象基类MyFunc,只有一个用来描述类型的成员变量type。
然后从基类中派生出一个模板类SubFunc这样就可以存放不同的回调函数了。
由于这些存放回调函数的模板类都是从同一个基类派生,所以我们直接存放它们的父类就可以了,之后可以根据父类

中的类型dynamic_cast为相应的子类。

typedef std::tr1::function<int(const unsigned char*, unsigned int)> TestCallback;class MyFunc{public:    int type;    virtual ~MyFunc() = 0 { }};template<typename Fty>class SubFunc : public MyFunc{public:    SubFunc(int t, std::tr1::function<Fty> f)    {        type = t;        func = f;    }    std::tr1::function<Fty> func;};void test1(int i){    std::cout << "test1:" << i << std::endl;}void test2(const std::string &str){    std::cout << "test2:" << str << std::endl;}void test3(int i, const std::string &str){    std::cout << "test3:" << i << "," << str << std::endl;}typedef std::tr1::shared_ptr<MyFunc> MyFuncPtr;std::map<int, MyFuncPtr> g_arr;void Add1(std::tr1::function<void(int)> f){    MyFuncPtr ptr(new SubFunc<void(int)>(1, f));    g_arr.insert(std::pair<int, MyFuncPtr>(1111, ptr));}void Add2(std::tr1::function<void(const std::string&)> f){    MyFuncPtr ptr(new SubFunc<void(const std::string&)>(2, f));    g_arr.insert(std::pair<int, MyFuncPtr>(2222, ptr));}void Add3(std::tr1::function<void(int, const std::string&)> f){    MyFuncPtr ptr(new SubFunc<void(int, const std::string&)>(3, f));    g_arr.insert(std::pair<int, MyFuncPtr>(3333, ptr));}void HandleAllCallback(const unsigned char *response){    // 解析response    std::map<int, MyFuncPtr>::iterator iter = g_arr.find(3333);    if (iter!=g_arr.end())    {        MyFunc *p = iter->second.get();        switch (p->type)        {        case 1:            {            int i = 1111;            dynamic_cast<SubFunc<void(int)>*>(p)->func(i);            }            break;        case 2:            {            std::string str2 = "str2";            dynamic_cast<SubFunc<void(const std::string&)>*>(p)->func(str2);            }            break;        case 3:            {            std::string str3 = "str3";            dynamic_cast<SubFunc<void(int, const std::string&)>*>(p)->func(3333, str3);            }            break;        default:            break;        }    }}int _tmain(int argc, _TCHAR* argv[]){    // 接口    Add1(std::tr1::bind(test1, std::tr1::placeholders::_1));    Add2(std::tr1::bind(test2, std::tr1::placeholders::_1));    Add3(std::tr1::bind(test3, std::tr1::placeholders::_1, std::tr1::placeholders::_2));    // OnMessage     unsigned char *response = NULL;    HandleAllCallback(response);    system("pause");    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 古墓丽影9出bug怎么办 气炉子打不着火怎么办 下面人员不参加公司拓展怎么办 重点班的差生怎么办 江苏考生选修考d怎么办 眼睛里有虫子该怎么办 屋里毛絮特别多怎么办 信用卡人员核核查单位地址怎么办 红米note电源键失灵怎么办 红米note4x跳屏怎么办 红米开机键坏了怎么办 红米note2开关键不灵敏怎么办 大学生论文检测系统忘记密码怎么办 快手实验室没有k歌怎么办 皮肤一到冬天就会起皮脱落怎么办 嘴上的皮撕破了怎么办 身体皮肤干燥起皮怎么办 把公司数据库弄宕机了怎么办 地铁上临时变站怎么办 大学实践课挂了怎么办 军训的人长得矮怎么办 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办