歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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,即無法創建它的實例、無法對它的實例初始化或賦值。只能對它的指針進行初始化和賦值然後使用。

Copyright © Linux教程網 All Rights Reserved