C++回撥函式
阿新 • • 發佈:2018-12-11
摘要:回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
#include <stdio.h> //回撥函式 int ADD(int (*callback)(int,int), int a, int b){ return (*callback)(a,b);//此處回撥add函式... } //普通函式 int add(int a, int b){ return a + b; } int main(void){ printf("%d\n",add(1,2)); printf("%d\n",ADD(add,1,2)); return 0; }
從上面的定義及其實現可以看出,回撥函式必須有函式指標的存在,而這裡函式指標一般可以先typedef一下,然後再使用, 一般格式: 返回值 (*指標名) (引數列表)
#include <stdio.h> //返回值(*指標名)(引數列表) typedef int (*callback)(int,int); //回撥函式 int ADD(callback p, int a, int b){ return (*p)(a,b);//此處回撥add函式... } //普通函式 int add(int a, int b){ return a + b; } int main(void){ printf("%d\n",add(1,2)); printf("%d\n",ADD(add,1,2)); return 0; }
可是,根據上面的例子,回撥函式搞得這麼麻煩,貌似並沒有什麼大作用.....糾結! 別糾結,來看一下庫函式中的sort排序是怎麼弄的。algorithm它提供了某些排序演算法的實現(如氣泡排序、快速排序、shell排序、shake排序等等),為了能讓庫更加通用,不想在函式中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,能讓庫可用於多種資料型別(int、float、string),此時,該怎麼辦呢?可以使用函式指標,並進行回撥,如下:
#include <stdio.h> #include <algorithm> bool cmp(int a, int b){ return a > b; } int main(void){ int a[8] = {5,43,1,7,8,13,0,74}; std::sort(a,a+10,cmp);//callback return 0; }