Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C++中使用模板传递函数类型

首先看了常用的写法:
  1. int fi(char){
  2. return 1;
  3. }
  4. int main(){
  5. int (*pf)(char)=fi;
  6. //以下两种函数调用方式,没有区别
  7. pf("a");//ok
  8. (*pf)("a");//ok
  9. return 0;
  10. }
是的,你可能就此以为函数指针在调用的时候,是否解引用都无所谓了吧?我跟你想得一样,是的,这是对的,但是注意我前面的用词“函数指针在调用的时候,是否解引用都无所谓”,那么还可能在什么情况下使用函数指针呢?没错,就是“使用模板传递函数类型”的时候!来看下面一个例子:
  1. template<typename T>
  2. class C{
  3. public:
  4. C(T _t){
  5. _t("a");//ok
  6. (*_t)("a");//ok
  7. T *t1=_t;//ok
  8. t1=_t;
  9. //(*t1)=_t;//compile error!assignment of read-only location
  10. //T t2=_t;//compile error!variable "t2" has function type
  11. }
  12. };
  13. int fi(char){
  14. return 1;
  15. }
  16. int main(){
  17. C<int(char)> c(fi);//使用模板传递函数类型
  18. return 0;
  19. }
int(char)是使用模板传递函数类型,c(fi)给C的构造函数传递函数指针fi,对fi的调用,可以使用_t("a")和(*_t)("a")两种方式(当然,你也可以在main函数中使用fi("a")和(*fi)("a")调用函数fi),但是对于int(char)类型的变量t2,却无法复制构造,只能使用指针赋值方式。在对int(char)函数类型变量赋值时,它表现得像是一个函数常量(就像函数名f1一样),而如果对其指针的引用赋值时,它表现得像typedef int(*const constPF)(char)一样。所以,它更像是一个“constructor、copy constructor和operator=”都为private的class,即无法创建它的实例、无法对它的实例初始化或赋值。只能对它的指针进行初始化和赋值然后使用。