1. 程式人生 > >C++慣用法:奇特的遞迴模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)

C++慣用法:奇特的遞迴模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)

意圖:

使用派生類作為模板引數特化基類。

與多型的區別:

多型是動態繫結(執行時繫結),CRTP是靜態繫結(編譯時繫結)

在實現多型時,需要重寫虛擬函式,因而這是執行時繫結的操作。

然而如果想在編譯期確定通過基類來得到派生類的行為,CRTP便是一種獨佳選擇,它是通過派生類覆蓋基類成員函式來實現靜態繫結的。

正規化:

示例程式碼:

缺點:

CRTP由於基類使用了模板,目前的編譯器不支援模板類的匯出,因而不能使用匯出介面。

其它使用領域:

在數值計算中,往往要對不同的模型使用不同的計算方法(如矩陣),一般使用繼承提供統一介面(如operator運算子),但又希望不損失效率。這時便又可取CRTP慣用法,子類的operator實現將覆蓋基類的operator實現,並可以編譯期靜態繫結至子類的方法。