C 之模板元程式設計

2021-08-04 11:24:48 字數 4376 閱讀 3127

關於模板原程式設計知識強烈推薦:非常好!

首先複述一下模板元程式設計,以下標紅或者加粗的地方是模板元程式設計的精髓:

從程式設計范型(programming paradigm)上來說,c++ 模板是

函式式程式設計

(functional programming),它的主要特點是:函式呼叫不產生任何***(沒有可變的儲存),

用遞迴形式實現迴圈結構的功能。c++模板的特例化提供了條件判斷能力,而模板遞迴巢狀提供了迴圈的能力,這兩點使得其具有和普通語言一樣通用的能力(圖靈完備性)。

從程式設計形式

來看,模板的「<>」中的模板引數相當於函式呼叫的輸入引數模板中的 typedef 或 static const 或 enum 定義函式返回值(型別或數值,數值僅支援整型,如果需要可以通過編碼計算浮點數),**計算是通過型別計算進而選擇型別的函式實現的(c++ 屬於靜態型別語言,編譯器對型別的操控能力很強)

模板下的控制結構:

template

<

boolc,

typename

then

,typename

else

>

class

if_;

template

<

typename

then

,typename

else

>

class

if_<

true

,then

,else

>;

template

<

typename

then

,typename

else

>

class

if_<

false

,then

,else

>;

// 隱含要求: condition 返回值 ret,statement 有型別 next

template

<

template

<

typename

>

class

condition

,typename

statement

>

class

while_;

public:

typedef

typename

if_<

condition

<

statement

>

::ret,

while_

<

condition

,typename

statement

::next

>,

stop

<

statement

>>

::retype

::retype

retype;

};

template

<

intn

,int

e>

class

sum_pow;}

; template

<

inti

>

class

pow_e

0>;}

; // 計算 i^e,巢狀類使得能夠定義巢狀模板元函式,private 訪問控制隱藏實現細節

template

<

inti

>

class

pow;};

template

<

typename

stat

>

class

cond;}

; template

<

inti

,int

sum>

class

stat;}

; public:

enum;

};int

main()

//**解析:

sum_pow<10,2>利用模板引數相當於函式呼叫的輸入引數。::ret是函式的返回值,用enum或者static const定義的變數。1.函式呼叫while_條件函式;2.while_條件函式呼叫其返回型別retype;3. while_條件函式呼叫if_函式;4.if_函式需要判斷cond的布林值;5.由於while_函式首先執行stat<1,0>函式;6.stat<1,0>會設定ri=1; 7.cond函式的返回值為true;8. if_函式返回then型別,即在此執行while_函式。整個模板的執行過程就是1+ 2*2 + 3*3* +....+10*10= 385

在講元容器之前,我們先來看看

偽變長引數模板

(文獻[1] 12.4),乙個可以儲存小於某個數(例子中為 4 個)的任意個數,任意型別資料的元組(tuple)的例子如下(參考了文獻[1] 第 225~227 頁):

#include

class

null_type

;// 標籤類,標記引數列表末尾

template

<

typenamet0,

typenamet1,

typenamet2,

typename

t3>

class

type_shift_node

// 建構函式

type_shift_node

(t0

const&d0

,t1

const&d1

,t2

const&d2

,t3

const&d3

) :data(d0

),next(d1

,d2,d3

,null_type()

)// next 引數也移位了 }

; template

<

typename

t0>

// 特例,遞迴終止

class

type_shift_node

null_type

,null_type

,null_type

>

// 建構函式

type_shift_node

(t0

const&d0

,null_type

,null_type

,null_type):

data(d0

) };

// 元組類模板,預設引數 + 巢狀遞迴

template

<

typenamet0,

typenamet1=

null_type

,typenamet2=

null_type,

typenamet3=

null_type

>

class

my_tuple

// 建構函式,預設引數 }

; // 為方便訪問元組資料,定義 get(tuple) 函式模板

template

<

unsignedi,

typenamet0,

typenamet1,

typenamet2,

typename

t3>

class

type_shift_node_traits }

; template

<

typenamet0,

typenamet1,

typenamet2,

typename

t3>

class

type_shift_node_traits

<0,

t0,t1,

t2,t3> }

; template

<

unsignedi,

typenamet0,

typenamet1,

typenamet2,

typename

t3>

typename

type_shift_node_traits

t0,t1,

t2,t3>

::data_type

get(my_tuple

t1,t2,

t3>

&tup)

intmain()

//變長引數利用的就是迴圈,通過將引數移位,然後設定null_type的方式實現變長引數

C 之 模板元程式設計(一)

利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋執行。模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。模板是一種對型別進行引數化的工具 通常有兩種形...

C 模板元程式設計

原理 模板元程式由編譯器在編譯期解釋執行,利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構。模板元程式設計 metaprogramming 意思是,程式設計系統將會執行我們所寫的 來生成新的 而這些新 才真正實現了我們所期望的功能。元程式設計最大的特點在於 某些使用者自定義的計...

C 模板元程式設計

昨天wl發給我一段我覺得很 奇怪 的c 當時沒看太懂,後來問了才知道是叫做模板元程式設計。template struct binary template specialization struct binary 0 terminates recursion 覺得很新奇,於是乎索要了一本電子書,名為 ...