3 回答

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
大多數(shù)示例歸結(jié)為回調(diào):您調(diào)用一個(gè)函數(shù)f()
傳遞另一個(gè)函數(shù)的地址g()
,并f()
調(diào)用g()
某些特定任務(wù)。如果您傳遞f()
了h()
相反的地址,f()
則會(huì)回?fù)?code>h()。
基本上,這是一種參數(shù)化函數(shù)的方法:其行為的某些部分不是硬編碼的f()
,而是進(jìn)入回調(diào)函數(shù)。f()
調(diào)用者可以通過傳遞不同的回調(diào)函數(shù)來使行為不同。經(jīng)典qsort()
來自C標(biāo)準(zhǔn)庫(kù),它將其排序標(biāo)準(zhǔn)作為指向比較函數(shù)的指針。
在C ++中,這通常使用函數(shù)對(duì)象(也稱為仿函數(shù))來完成。這些是重載函數(shù)調(diào)用操作符的對(duì)象,因此您可以像調(diào)用函數(shù)一樣調(diào)用它們。例:
class functor { public: void operator()(int i) {std::cout << "the answer is: " << i << '\n';}};functor f;f(42);
這背后的想法是,與函數(shù)指針不同,函數(shù)對(duì)象不僅可以攜帶算法,還可以攜帶數(shù)據(jù):
class functor { public: functor(const std::string& prompt) : prompt_(prompt) {} void operator()(int i) {std::cout << prompt_ << i << '\n';} private: std::string prompt_;};functor f("the answer is: ");f(42);
另一個(gè)優(yōu)點(diǎn)是,與通過函數(shù)指針調(diào)用相比,有時(shí)更容易內(nèi)聯(lián)調(diào)用函數(shù)對(duì)象。這就是為什么在C ++中排序有時(shí)比在C中排序更快的原因。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
好吧,我通常在跳轉(zhuǎn)表中使用它們(專業(yè))(另請(qǐng)參閱此StackOverflow問題)。
跳轉(zhuǎn)表通常(但不是唯一地)用于有限狀態(tài)機(jī)中以使它們被數(shù)據(jù)驅(qū)動(dòng)。而不是嵌套的開關(guān)/案例
switch (state) case A: switch (event): case e1: .... case e2: .... case B: switch (event): case e3: .... case e1: ....
你可以制作一個(gè)2d數(shù)組或函數(shù)指針,然后調(diào)用 handleEvent[state][event]
- 3 回答
- 0 關(guān)注
- 1674 瀏覽
添加回答
舉報(bào)