使用函式指標來代替switch case

2021-10-10 04:06:20 字數 1412 閱讀 9545

#include

intmain()

return1;

}

#include

void

printffunc0()

void

printffunc1()

void

printffunc2()

void

printffunc3()

void

printffunc4()

void

printffunc5()

void

(*pfunc[6]

)();

//定義乙個空的函式指標陣列

void

myfunction

(int number)

void

register()

intmain()

這樣做的好處是在主函式中就沒有大量的switch case分支,把每個分支的邏輯單獨出來作為乙個函式,把這些函式指標放進乙個陣列中,然後根據number找到對應的函式指標。

由於函式指標陣列的限制,這些函式有必須有相同的函式原型。

上面這樣改是不安全的,原因在於,當number為6或者更大時,找不到對應的函式指標,程式會有段錯誤。而傳統的switch case則會執行de****t處的**。

稍作修改,充分利用stl庫。

#include

#include

using

namespace std;

void

printffunc0()

void

printffunc1()

void

printffunc2()

void

printffunc3()

void

printffunc4()

void

printffunc5()

map<

int,

void(*

)()>mapinttofunc;

void

myfunction

(int number)

void

register()

intmain()

switch-case會生成乙份表項數為case量+1的跳表,程式首先判斷switch變數是否大於(小於)最大(最小)case 常量,若大於(小於),則跳到default分支處理;否則取得索引號為switch變數大小的跳表項的位址(即跳表的起始位址+表項大小*索引號),程式接著跳到此位址執行,到此完成了分支的跳轉。

可見上面這種方法也是生成乙個表(乙個函式指標表),所以這種方法的效率和switch case是相同的。

通過委託實現方法陣列來代替switch分支語句

在實際應用中經常會有對乙個傳入的型別進行檢測後,再通過 switch 進行分類處理,如下 private void response cmdtype cmd switch cmd case cmdtype.hello sayhello break case cmdtype.gettime sendt...

用函式指標代替switch case

static void showmenu e menu index eindex 顯示指定的選單 static void showmenu main 顯示主選單 static void showmenu rec add 顯示選單 新增資料 static void showmenu rec del 顯...

使用列舉enum來代替if else

在平時的 中,if else肯定是必不可少,但是有時使用if else卻不是 的最好選擇,下面介紹下平時會在實際工作 中使用到的用enum來代替if else的寫法.現在有個需求,我們公司有vip等級,1,2,3,根據等級高低,能獲取不同的優惠資訊,最簡單也最容易想到的 是 獲取折扣資訊 publi...