關於模板原程式設計知識強烈推薦:非常好!
首先複述一下模板元程式設計,以下標紅或者加粗的地方是模板元程式設計的精髓:
從程式設計范型(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 覺得很新奇,於是乎索要了一本電子書,名為 ...