use*_*770 3 c++ design-patterns switch-statement
我见过类似的线程,但是,不知道如何将解决方案完全应用到我的案例中.我的问题是我有一组用例可以说'A','B','C',当输入传递时需要执行某些命令(2个用例是输入)是列出的任何2个用例.例如:
switch(input1)
{
case A:
break;
case B:
break;
case C:
break;
}
Run Code Online (Sandbox Code Playgroud)
在每种情况下,我将不得不检查输入2,因此,最终的代码可能看起来像
switch(input1)
{
case A:
{
switch(input2):
case B:
break;
case c:
break;
}
case B:
{
switch(input2):
case A:
break;
case c:
break;
}
....
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用(pair,command)的地图并删除这个开关案例,但有没有其他更好的解决方案或设计问题来解决这个问题?
如果性能不是一个大问题,那么函数指针的映射可能是一个解决方案.
假设标签A,B,C...是小小于整数值255.
首先设置地图
#define KEY(a,b) ( (a<<8) | b )
std::map<int, function_pointer_type> dispatcher =
{
{ KEY(A,B), ab_handler},
{ KEY(A,C), ac_handler},
{ KEY(B,C), bc_handler},
//etc
};
Run Code Online (Sandbox Code Playgroud)使用映射为每组输入调用适当的处理程序:
dispatcher[KEY(input1,input2)] (/* args */);
Run Code Online (Sandbox Code Playgroud)请注意,您必须使用每对可能的输入设置调度程序.此外,如果对KEY(A,B)和KEY(B,A)是相同的情况,那么您可以编写一个函数invoke来处理这种情况,以便为其余代码提供统一的用法.
void invoke(int input1, int input2, /* args */)
{
if (dispatcher.find(KEY(input1, input2)) != dispatcher.end() )
dispatcher[KEY(input1,input2)] (/* args */);
else
dispatcher[KEY(input2,input1)] (/* args */);
}
Run Code Online (Sandbox Code Playgroud)
然后用它作为:
invoke(input1, input2, /* args */);
invoke(input2, input1, /* args */); //still okay!
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
6631 次 |
| 最近记录: |