C++中使用模板傳遞函數類型

來源:互聯網
上載者:User

首先看了常用的寫法:

int fi(char){return 1;}int main(){int (*pf)(char)=fi;//以下兩種函數調用方式,沒有區別pf('a');//ok(*pf)('a');//okreturn 0;}

是的,你可能就此以為函數指標在調用的時候,是否解引用都無所謂了吧?我跟你想得一樣,是的,這是對的,但是注意我前面的用詞“函數指標在調用的時候,是否解引用都無所謂”,那麼還可能在什麼情況下使用函數指標呢?沒錯,就是“使用模板傳遞函數類型”的時候!

來看下面一個例子:

template<typename T>class C{public:C(T _t){_t('a');//ok(*_t)('a');//okT *t1=_t;//okt1=_t;//(*t1)=_t;//compile error!assignment of read-only location//T t2=_t;//compile error!variable 't2' has function type}};int fi(char){return 1;}int main(){C<int(char)> c(fi);//使用模板傳遞函數類型return 0;}

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,即無法建立它的執行個體、無法對它的執行個體初始化或賦值。只能對它的指標進行初始化和賦值然後使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.