本書第5章標題為泛化仿函數,我認為本章真正講述的內容可以總結出一句話!
如何利用C++老標准實現C++11新標准類似std::function提供的功能。
分析std::function源碼可知,std::function大量利用新標准的特性,變長參數模板,完美轉發等。
C++中的可調用體,現在可以補充一下
1.C-like function
2.C-like pointer to function
3.reference to function
4.function object
5.pointer to member function
6.ctor
7.C++11 lambda
對於上述所列的任何一項,你可以在右側添加一對圓括號(),並在裡頭放入一組合適的參數,用以執行某個處理動作。
之後,講述的Functor即是對以1-6可調用形式的封裝。Functor可以傳遞,對於對於不同的調用體,但擁有相同的調用形式,提供統一的類型。
作者在書中105頁感歎,“數量可變的template參數”根本不存在。(C++11變長參數模板)
雖說巧婦難為無米之炊,但是真正的能工巧匠並面對生產工具的限制也不會妥協,本書作者即是如此。
書中122頁,討論轉發函數的成本,在尾注中提到“引用折疊”,C++之父 Bjarne Stroustrup 提交報告,允許使用reference to reference。
(C++11 引用折疊,完美轉發std::forward)
1.認識到語言的限制,以及如何利用編程技藝消除這種限制。
2.能夠預知,斷言,甚至影響語言未來的發展。
我聽聞一個故事,很久以前一位教授數據結構的老師,有一天他講完鏈表後,底下有同學提問:“老師,我使用VB語言,VB沒有指針,沒法實現鏈表!”。
眾所周知,沒有指針也可以實現鏈表,靜態(數組)鏈表就是證明。這位同學知道語言的限制,但沒有探索如何突破這個限制,《C++設計新思維》作者Andrei運用typelist技術突破了模板參數不可變的限制,並使得泛型編程與設計模式有機融合。
取其上者得乎其中,諸位我們的目標是精通一門語言,向Andrei學習。