metaprogramming笔记
動態多態與靜態多態
動態多態:允許我們通過單個基類指針或引用處理多個派生類型的對象. 模板元編程中強調靜態多態,允許不同類型的對象以同樣的方式被操縱,只要它們支持某種共通的語法即可.
動態多態,連同"延遲綁定"或"運行期派發",是面向對象程序的關鍵特性.靜態多態(也稱參數化多態),是泛型編程的本質要素.
?
在面向對象的編程文獻中將一個帶有大量成員的類稱作blob.類的成員彼此"耦合",因為它們必須被聲明在一起.為了避免耦合并提高模塊化程度,應該避免使用這種反模式.替代
方式是采用獨立的元函數來定義單獨的traits
?
元數據:可以被C++編譯期系統操縱的"值"可以被認為是元數據.在模板元編程中,兩種最常見的數據是類型和整數(包括bool)常量. C++的編譯期部分通常被稱為"純函數式語言"
,因為元數據是可變的并且元函數不可以有任何副作用.
?
多態:由于C++模板并非生來就多態地處理不同種類的元數據,因此MPL遵從使用type wrapper來包裝非類型元數據的約定.尤其是,數值型元數據被表示為一個類型,該類型具有一個名為::value的
嵌套數值常量成員
元函數
數值型元函數
無參元函數:一般是作為元函數特化,解決基礎數據類型的問題
?
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);} };?
轉載于:https://www.cnblogs.com/hustxujinkang/p/4982445.html
總結
以上是生活随笔為你收集整理的metaprogramming笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPenGL中的缓冲区对象
- 下一篇: 我的iOS学习历程 - UISlider