意圖:
使用派生類作爲模板參數特化基類。
與多態的區別:
多態是動態綁定(運行時綁定),CRTP是靜態綁定(編譯時綁定)
在實現多態時,需要重寫虛函數,因而這是運行時綁定的操作。
然而如果想在編譯期確定通過基類來得到派生類的行爲,CRTP便是一種獨佳選擇,它是通過派生類覆蓋基類成員函數來實現靜態綁定的。
範式:
示例代碼:
缺點:
CRTP由於基類使用了模板,目前的編譯器不支持模板類的導出,因而不能使用導出接口。
其它使用領域:
在數值計算中,往往要對不同的模型使用不同的計算方法(如矩陣),一般使用繼承提供統一接口(如operator運算符),但又希望不損失效率。這時便又可取CRTP慣用法,子類的operator實現將覆蓋基類的operator實現,並可以編譯期靜態綁定至子類的方法。
英文鏈接:http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern