相关文章推荐
潇洒的弓箭  ·  c语言switch ...·  1 周前    · 
性感的绿豆  ·  对 ASP.NET Core ...·  7 月前    · 
考研的葡萄  ·  [UE4]模型从3D ...·  1 年前    · 
叛逆的橡皮擦  ·  Day 27. ...·  1 年前    · 
//多态+std::map取代switch std::map baseMap; baseMap.insert(std::make_pair(enumOne,new MessageOne)); baseMap.insert(std::make_pair(enumTwo,new MessageTwo)); baseMap.insert(std::make_pair(enumThree,new MessageThree)); baseMap[enumOne]->showMessage(); baseMap[enumTwo]->showMessage(); baseMap[enumThree]->showMessage(); return 0;

上述完全是一个面向过程到面向对象的转变:将每个case分支都作为一个子对象,然后用C++语言的多态性去动态绑定。这样做确实是带来了性能上的损失,但是在当今的CPU计算能力而言,这是可以忽略的,而它带来的好处却很有用:
(1)分支的增减只要继续派生即可;
(2)子类代表了一个case,比必须用type去硬编码的case语句更加具有可读性;
(3)代码的可读性增强,使得分支的维护性增加;
(4)面向对象的思想更加符合人看世界的方式;
(5)避免了漏写break语句造成的隐蔽错误。

三.函数指针+std::map取代switch

#include <map>
enum EnumType
    enumOne,
    enumTwo,
    enumThree
void showMessageOne()
    printf("This is message one\n");
void showMessageTwo()
    printf("This is message two\n");
void showMessageThree()
    printf("This is message three\n");
int main()
//函数指针+std::map取代switch
    typedef void (*func)();
    std::map<int,func> funcMap;
    funcMap.insert(std::make_pair(enumOne,showMessageOne));
    funcMap.insert(std::make_pair(enumTwo,showMessageTwo));
    funcMap.insert(std::make_pair(enumThree,showMessageThree));
    funcMap[enumOne]();
    funcMap[enumTwo]();
    funcMap[enumThree]();
    return 0;

值得注意的是函数指针要用typedef定义,否则报错。

四.状态模式取代switch

关于设计模式中的状态模式可参考:C++设计模式——状态模式

直接上代码。

#include <stdio.h>
class Context;
class State
public:
    State(){}
    virtual ~State (){}
    virtual void showMessage(Context *pContext)=0;
class MessageOne:public State
public:
    MessageOne(){}
    ~MessageOne(){}
    void showMessage(Context *pContext)
        printf("This is message one\n");
class MessageTwo:public State
public:
    MessageTwo(){}
    ~MessageTwo(){}
    void showMessage(Context *pContext)
        printf("This is message two\n");
class MessageThree:public State
public:
    MessageThree(){}
    ~MessageThree(){}
    void showMessage(Context *pContext)
        printf("This is message three\n");
class Context
public:
     Context(State *pState) : m_pState(pState){}
     void Request()
          if (m_pState)
               m_pState->showMessage(this);
     void ChangeState(State *pState)
          m_pState = pState;
private:
     State *m_pState;
int main()
     State *pStateA = new MessageOne();
     State *pStateB = new MessageTwo();
     State *pStateC = new MessageThree();
     Context *pContext = new Context(pStateA);
     pContext->Request();
     pContext->ChangeState(pStateB);
     pContext->Request();
     pContext->ChangeState(pStateC);
     pContext->Request();
     delete pContext;
     delete pStateC;
     delete pStateB;
     delete pStateA;
     return 0;

三种方法的运行结果如下图所示:

原创不易,转载请标明出处:C++ 取代switch的三种方法_草上爬的博客-CSDN博客_c++中switch函数可以用什么代替

上述完全是一个面向过程到面向对象的转变:将每个case分支都作为一个子对象,然后用C++语言的多态性去动态绑定。(2)子类代表了一个case,比必须用type去硬编码的case语句更加具有可读性;值得注意的是函数指针要用typedef定义,否则报错。(3)代码的可读性增强,使得分支的维护性增加;(5)避免了漏写break语句造成的隐蔽错误。(4)面向对象的思想更加符合人看世界的方式;(1)分支的增减只要继续派生即可;
通常来说,出现不同数据格式转换的场景,比如给定一个整数,将它与每周的星期名称映射,通常会采用if-else或switch语句,但是这种语句存在两个问题 (1)代码太长,逻辑重复冗余,复杂度高 (2)可维护性低,耦合性强,每新增一个流程分支,就要在函数代码中新添加一个判断语句。 这里介绍一种通用的表驱动实现方法替代以上方式。 要实现一个通用的表驱动模式需要解决两个问题: (1)如何在表中注册不同类型...
在一些公司使用C语言开发,对于圈复杂度有一定的要求,其中switch就是造成高圈复杂的原因之一,这里分享一种方法降低圈复杂,使用数组代替switch,直接上代码,代码简单明了,如果发现代码中有问题或者疑惑可以提出来一同讨论。在实际的应用中需要自己去摸索,根据不同的场景,数据结构(结构体)会有所不同。#include &lt;stdio.h&gt; #include &lt;string.h&gt;...
个人觉得不能一味排斥和推崇采用其他方法替代switch-case。 但如果对于一些情况采用map+函数指针去替代switch会极大的优化代码,整洁和使代码不会那么膨胀。 对于多个函数的参数相同的情况下,采用map+函数指针。 比如:分别case 为1,2,3 分别执行不同的函数,如果有很多函数就会导致代码臃肿。 class A public: int test1(int a); int test2(int a); int test3(int a); int Ge
之前讲到了C++设计模式——简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码。是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简单,如果工程大了,出错也是在所难免的!!!)。这种对代码的修改是最原始,最野蛮的修改,本质上不能称之为对代码的扩展。同时,由于对已经存在的函数进行了修改,那么以前进行过的测试,都将是无效的,所有的测试,都将需要重 其中,expression为需要比较的表达式,case后面跟的是常量表达式,用来与表达式expression进行比较。如果表达式expression的值与某个case后面的常量表达式相等,则执行该case后面的语句块。如果没有任何case的常量表达式与表达式expression的值相等,则执行default后面的语句块。 在执行语句块时,可以使用break语句来跳出switch语句,直接执行switch后面的语句。如果没有使用break语句,则会一直执行到遇到break或者switch语句结束为止。 以下是一个简单的示例: #include <iostream> using namespace std; int main() { int num = 2; switch (num) { case 1: cout << "num is 1" << endl; break; case 2: cout << "num is 2" << endl; break; case 3: cout << "num is 3" << endl; break; default: cout << "num is not 1, 2 or 3" << endl; return 0; 输出结果为:num is 2