1. 程式人生 > >C++回撥函式

C++回撥函式

摘要:回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。

#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;
}