带有模板参数的函数指针

如果能定义一个带有模板参数的函数指针,例如:

template <class T> void (*pf)(T);

它就可以指向任何一个带有一个任何类型参数的函数了。但这种语法不被编译器支持。

可以把这种类型的指针作为一个普通模板函数的参数来间接实现这种效果。例如:

上面的代码中,DF宏用来产生函数。DF有两个参数,第一个参数是函数名字,第二个参数是所要产生的函数的参数的类型。DF可以产生仅有一个参数(可以是任何类型)的函数。函数gx的参数是一个函数指针,它指向一个只有一个参数的函数。这样,虽然不能直接定义带有模板参数的函数指针,但是可以利用函数模板来把这种指针作为函数参数。上面的代码运行结果为:

a(char)

b(short)

c(int)

d(double)

e(long *)

C++11引入了对函数指针的增强支持,使得函数指针的声明更加灵活和强大。函数指针是一种特殊的指针类型,它存储的是指向函数的地址,可以在运行时调用这些函数。在C++11中,函数指针的声明主要有以下几种形式: 1. **普通函数指针**: ```cpp // 声明指向返回类型为T,接受一个参数类型的函数 void (*func_ptr)(参数类型); ``` 例如,声明一个指向整数的加法函数指针: ```cpp int (*add)(int, int); ``` 2. **带默认参数值的函数指针**: ```cpp // 声明指向接受可选参数函数,如带有默认参数void函数 void (*func_ptr)(参数类型 = 默认值); ``` 注意,这种形式仅限于C++11及更高版本,对于不带默认参数函数,C++11中仍然是按统的形式声明。 3. **指向成员函数函数指针**: ```cpp // 声明指向类成员函数函数指针 void (ClassType::*mem_func_ptr)(参数类型); ``` 用于存储类的成员函数地址。 4. **重载函数指针**: ```cpp // C++11之前的方式,使用std::function模板或boost库 // C++11后,使用函数指针模板(如std::function<void(int)>)或直接声明 // 注意:函数指针模板不能用于捕获默认参数 std::function<void(参数类型)> func_ptr; ``` **相关问题--:** 1. C++11如何声明带默认参数值的函数指针? 2. 如何在C++11中声明指向类成员函数函数指针? 3. C++11标准引入了哪些新的函数指针声明语法?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值