• 9378阅读
  • 7回复

使用成员函数指针实现动态函数映射 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-28
— 本帖被 XChinux 执行加亮操作(2008-09-28) —
有时候要根据参数以运行指定的函数,这里面的比较简单,这若干个函数的类型是相同的,最容易想到的办法是使用switch case或者if else等实现一个一个对比调用,代码往往很长,这里以函数指针的方式实现,代码比较简单了就。

exam.hpp 头文件
#ifndef EXAM_HPP
#define EXAM_HPP

#include <string>
#include <map>

class Exam;
typedef void (Exam::*FuncT)(Type1);
class Exam
{
public:
    Exam();
    void dispatch(std::string key, Type1 param);
......
    void onFunc1(Type1);
    void onFunc2(Type1);
    void onFunc3(Type1);
    void onFunc4(Type1);
private:
    static std::map<std::string, FuncT> mapFunc;
};

#endif


exam.cpp
#include "exam.hpp"

std::map<std::string, FuncT> Exam::mapFunc;

Exam::Exam()
{
    if (mapFunc.empty())
   {
        mapFunc["one"] = &Exam::onFunc1;
        mapFunc["two"] = &Exam::onFunc2;
        mapFunc["three"] = &Exam::onFunc3;
        mapFunc["four"] = &Exam::onFunc4;
   }
}

void Exam::dispatch(std::string key, Type1 param)
{
    if (mapFunc.find(key) != mapFunc.end())
   {
        (this->*mapFunc[key])(param);
   }
}

void Exam::onFunc1(Type1 param)
{
}

void Exam::onFunc2(Type1 param)
{
}

void Exam::onFunc3(Type1 param)
{
}

void Exam::onFunc4(Type1 param)
{
}


通过以上方法,实现了根据键自动分配要处理的函数的问题。维护起来比较简单。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线snow_man_0

只看该作者 1楼 发表于: 2008-09-29
何必这样呢,用抽象工厂模式更好
离线chinafei
只看该作者 2楼 发表于: 2008-09-29
我晕,啥是抽象工厂模式
离线wvins
只看该作者 3楼 发表于: 2008-09-30
楼上的楼上的会不会有点杀鸡用牛刀了?
编程的终极目标是解决问题,而不是为了使用先进的技术。
---
设计模式一个重要的目标就是避免了频繁的Switch case或者是if else。
可是不是什么地方都要用上设计模式这种重量级的武器的。

楼主的解决方案实际上可以看成是Strategy模式或者State模式的简化
就像windows的消息队列是Observer模式的简化一样?
说反了,Observer模式是Windows消息队列的升级和抽象
----------
话说回来,Qt应该也是使用或者封装的消息队列吧?
不知道有没有高手可以指教一二,或者告诉我去什么地方找找资料也行
离线XChinux

只看该作者 4楼 发表于: 2008-09-30
主要是为了避免一个一个的if else if else,包括switch case也是一样,我所列出的是一个服务程序要处理的东西,要频繁地进行识别调用,识别调用,而且所谓的key有很多,至少有几十个,使用map来处理一是为了省去if else形式的代码不好维护,二是"看上去似乎能提高点"效率,不知道编译器能优化到什么程度,至少不用每次都从上到下一个一个地比较,使用map是经过排序的,总比无序的一个一个比较的速度快。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fifawww

只看该作者 5楼 发表于: 2009-07-09
恩,好思路
离线foxyz

只看该作者 6楼 发表于: 2009-07-10
嗯,函数指针放在类里面还是得注意安全,我一般把函数指针放在namespace里
离线qicosmos
只看该作者 7楼 发表于: 2009-07-10
用工厂模式比较好解决这个问题,太多分支维护很不方便。
Qt交流学习
快速回复
限100 字节
 
上一个 下一个