函数指针用于指向返回值类型和参数列表相同的函数,假设有两个返回值类型和参数列表相同的函数:
string add(int a, int b){
cout<<a+b<<' ';
return "add";
}
string sub(int a, int b){
cout<<a-b<<' ';
return "sub";
}
一.普通函数指针定义
pf是一个函数指针,它可以指向任意返回值类型为string且参数列表为(int, int)的函数。
pfs是一个函数指针数组,用法如下。
int main(){
//函数指针
string (*pf)(int, int);
pf=&add;
cout<<pf(100, 10)<<endl;
//函数指针数组
string (*pfs[2])(int, int) = {add, sub};
cout<<pfs[1](100, 10)<<endl;
return 0;
}
二.使用typedef定义函数指针类型
pf类似一个类或数据类型,用它创建一个对象fac或声明一个变量fac。下面的程序给出了单个指针和指针数组的例子。
int main(){
typedef string (*pf)(int, int);
//函数指针
pf fac = add;
cout<<fac(100, 10)<<endl;
//函数指针数组
pf facs[2] = {add, sub};
cout<<facs[1](100, 10)<<endl;
return 0;
}
三.函数指针做参数
下面的程序给出了两种方法,分别是fuc1和fuc2。
void fuc1(int nValue, string pf(int, int)){
cout<<nValue<<' '<<pf(100, 10)<<endl;
}
typedef string (*pf)(int, int);
void fuc2(int nValue, pf fac){
cout<<nValue<<' '<<fac(100, 10)<<endl;
}
int main(){
fuc1(1000,add);
fuc2(1000,add);
return 0;
}
四.函数指针及其参数列表做参数
创建多线程或Tensorflow的一些函数接收函数名和参数列表做参数,下面是这种函数的实现原理。
test函数的两个参数,一个是函数指针,一个是参数。void*类型的参数可以传递任意类型的参数,但使用前要转换成原类型。
#include <iostream>
using namespace std;
typedef struct Params{
int a;
string b;
}Params;
void fac(int a, string b){
cout<<a+100<<' '<<b<<endl;
}
void test(void pf(int, string), void* params){
Params args=*(Params*)params;
pf(args.a, args.b);
}
int main(){
Params params{100, "abc"};
test(fac, ¶ms);
return 0;
}