实在不想在此处用switch…请教各位有没有其他替代品?
void MyClass::DispatchMessage(Message & msg)
{
Message是一个“消息参数”基类,其派生出“键盘消息” “鼠标消息”等类,
而当外部调用这个函数时,我不得不这样写,才知道传入了哪个参数:
switch(msg.MessageID)
{
case MID_KEYBOARD:
DispatchMessage(dynamic_cast<KeyboardMsg&>(msg));
………
请问有没有不用switch的办法?
[解决办法]
#include <typeinfo>
#include <map>
#include <iostream>
class TypeInfoWarpper
{
public:
TypeInfoWarpper(std::type_info const & info) : pTypeInfo(&info) {}
friend bool operator < (TypeInfoWarpper const& t1, TypeInfoWarpper const& t2)
{
return t1.pTypeInfo->before(*t2.pTypeInfo);
}
private:
std::type_info const * pTypeInfo;
};
class Base
{
public:
virtual ~Base() {}
};
class Sub1 : public Base
{
public:
virtual ~Sub1() {}
};
class Sub2 : public Base
{
public:
virtual ~Sub2() {}
};
void fun(Sub1 &)
{
std::cout<<"Sub1"<<std::endl;
}
void fun(Sub2 &)
{
std::cout<<"Sub2"<<std::endl;
}
template <typename Type>
void dispatcher_fun(Base & base)
{
fun(dynamic_cast<Type&>(base));
}
typedef std::map<TypeInfoWarpper, void (*)(Base&)> map_type;
map_type dispatcher_map;
typedef map_type::value_type value_type;
void dispatcher(Base & base)
{
dispatcher_map[typeid(base)](base);
}
int main()
{
dispatcher_map.insert(value_type(typeid(Sub1), dispatcher_fun<Sub1>));
dispatcher_map.insert(value_type(typeid(Sub2), dispatcher_fun<Sub2>));
Base * pBase1 = new Sub1;
Base * pBase2 = new Sub2;
dispatcher(*pBase1);
dispatcher(*pBase2);
delete pBase1;
delete pBase2;
return 0;
}
// 维户数组长度
#define dim(x) (sizeof(x) / sizeof(x[0]))
// 消息关联结构
struct MsgAss
{
UINT code;
LRESULT (*fxn)(hwnd,....);
};
// 注册: 消息与处理函数关联
const struct MsgAss mainMessages[] = {
WM_PAINT, paint_Proc,
WM_XXXX, xxxxx_Proc,
...
}
//消息处理 mainWndProc:
//..
for (int i=0; i<dim(mainMessages); ++i)
{
if (wMsg == mainMessages[i].code)
return (mainMessages[i].fxn)(hWnd, wMsg, ......);
}
//..