函式回撥(C++)

ComputerEngine發表於2024-03-10

函式回撥

C++部分

​ 從C#逆向理解回去,這玩意應該就是delegate的原型了,只不過C#中將其作為一個單獨的變數型別方便做管理,而C++這個老畢登這裡則是以指標的形式表現出來。

​ 作用在於,你不需要關心函式具體內容是什麼,也不需要關心函式到底會處理什麼,你只需要直接呼叫這個定義了的回撥函式,然後他就會自己幹活。在外部,你再寫出每一個不同處理過程的函式,然後塞給他。也就是說,回撥函式是為了程式的可擴充性而存在的。如果這部分沒看明白,往下看樣例程式碼就知道了

​ 所定義的形式是:void [函式名]( (*[回撥函式名])(引數) ),舉例:void func( (*pointerFunction)() ),如果要接受多個引數,那麼必須重新定義新的過載,以下解釋由Bing AI給出:

然而,你需要為每一個接受不同引數的函式定義一個新的 callback 函式。這是因為在 C++ 中,函式的引數數量和型別是函式簽名的一部分,所以接受不同引數的函式會被視為不同的函式。

啥比C++(惱


​ 在OI競賽裡,C++選手總會掏出他閃閃發光的STL,然後驕傲的從裡面拿出一個叫做sort的函式,而sort函式的第三個傳參就是一個回撥函式。我們自定義一個bool返回型別的函式,這樣就可以進行自定義排序規則,想了想,這應該就是平時見的最多的回撥函式了。

高貴C++(笑


以下是回撥函式的一個展示程式碼:

#include<iostream>
using namespace std;

void fst(){
    cout<<1<<endl;
}
void sec(){
    cout<<2<<endl;
}
void trd(){
    cout<<3<<endl;
}
void callback(void(*p)()){
    (*p)();
}

int main()
{
    callback(fst);
    callback(sec);
    callback(trd);
    return 0;
}

以上程式碼會輸出以下結果:

1
2
3

Unity部分

\(\huge{去用delegate吧。}\)

相關文章