metaprogramming筆記

動態多態與靜態多態編程

動態多態:容許咱們經過單個基類指針或引用處理多個派生類型的對象. 模板元編程中強調靜態多態,容許不一樣類型的對象以一樣的方式被操縱,只要它們支持某種共通的語法便可.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);
    }
};
相關文章
相關標籤/搜索