gpt4 book ai didi

c++ - 是否有任何设计模式可以避免嵌套的开关盒?

转载 作者:太空狗 更新时间:2023-10-29 19:53:21 25 4
gpt4 key购买 nike

我见过类似的线程,但是,不确定如何将这些解决方案准确地应用到我的案例中。我的问题是我有一组用例可以说'A','B','C',当输入通过(2个用例是输入)是列出的用例中的任何2个时,我需要执行某些命令.例如:

switch(input1)
{
case A:
break;
case B:
break;
case C:
break;
}

在每种情况下,我都必须检查输入 2,所以,最终的代码可能是这样的

switch(input1)
{
case A:
{
switch(input2):
case B:
break;
case c:
break;
}
case B:
{
switch(input2):
case A:
break;
case c:
break;
}
....

}

我正在考虑使用 (pair,command) 的映射并删除这个 switch cases,但是有没有其他更好的解决方案或设计问题来解决这个问题?

最佳答案

如果性能不是是个大问题,那么函数指针映射可能是一种解决方案。

假设标签 A, B , C ... small 整数值小于 255.

  • 先设置 map

    #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
    };
  • 使用映射为每组输入调用适当的处理程序:

     dispatcher[KEY(input1,input2)] (/* args */);

请注意,您必须使用每对可能的输入设置调度程序。此外,如果 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 */);
}

然后将其用作:

 invoke(input1, input2, /* args */);
invoke(input2, input1, /* args */); //still okay!

希望对您有所帮助。

关于c++ - 是否有任何设计模式可以避免嵌套的开关盒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com