動態多態與靜態多態編程
動態多態:容許咱們經過單個基類指針或引用處理多個派生類型的對象. 模板元編程中強調靜態多態,容許不一樣類型的對象以一樣的方式被操縱,只要它們支持某種共通的語法便可.app
動態多態,連同"延遲綁定"或"運行期派發",是面向對象程序的關鍵特性.靜態多態(也稱參數化多態),是泛型編程的本質要素.模塊化
在面向對象的編程文獻中將一個帶有大量成員的類稱做blob.類的成員彼此"耦合",由於它們必須被聲明在一塊兒.爲了不耦合並提升模塊化程度,應該避免使用這種反模式.替代函數
方式是採用獨立的元函數來定義單獨的traits指針
元數據:能夠被C++編譯期系統操縱的"值"能夠被認爲是元數據.在模板元編程中,兩種最多見的數據是類型和整數(包括bool)常量. C++的編譯期部分一般被稱爲"純函數式語言"對象
,由於元數據是可變的而且元函數不能夠有任何反作用.blog
多態:因爲C++模板並不是生來就多態地處理不一樣種類的元數據,所以MPL聽從使用type wrapper來包裝非類型元數據的約定.尤爲是,數值型元數據被表示爲一個類型,該類型具備一個名爲::value的it
嵌套數值常量成員io
元函數編譯
數值型元函數
無參元函數:通常是做爲元函數特化,解決基礎數據類型的問題
Traits:一種經過類模板特化在小片元數據之間創建關聯的技術. Traits慣用法的一個關鍵特性是它是非侵入性的:咱們能夠在不修改被關聯項自身的前提下,創建一個新的映射.MPL元函數能夠看作
traits的一個特例,它們對於任何輸入都只有一個結果值.
變長模板:
通常講的都是變長類型模板參數,這裏是一個變長非類型模板參數的例子,基本辦法仍是同樣的,就是取出一個,而後不斷特化,直到最後剩一個模板參數
#include<cstdio> template<int...A> struct container{ void display(){printf("YIKES\n");} }; template<int B, int ...C> struct container<B, C...>{ void display(){ printf("spec %d\n", B); container<C...> test; test.display(); } }; template<int C> struct container<C>{ void display(){ printf("spec %d\n", C); } };