c 泛型程式設計 之 TypeLists

2021-06-28 19:45:43 字數 2556 閱讀 1278

完整** 在 

關於 c++ 泛型中的 typetraits ,參考 c++ 泛型程式設計 之 typetraits

#ifndef type_lists_h_

#define type_lists_h_

#include #include #include "typetraits.h"

/*typelists 內部沒有任何數值(value),他們的實體是空的,不含有任何狀態,也未定義任何函式。

執行期間typelists也不帶任何數值,他們存在的理由只是為了可攜式別資訊。typelists 並未打算被具

現化。因此,當我們說「a typelistl」,實際指的是乙個typelist型別,不是乙個typelist 物件。

規定 typelist 必須以nulltype(類)結尾,nulltype可被視為乙個結束符號,類似於c字串的\0功能,

定義乙個只有乙個元素的typelist如下:

typedef typelistonetypeonly.

*/templatestruct typelist

;//通過定義巨集 將typelist線性化

#define typelist_0() nulltype

#define typelist_1(t1) typelist#define typelist_2(t1,t2) typelist#define typelist_3(t1,t2,t3) typelist#define typelist_4(t1,t2,t3,t4) typelist#define typelist_5(t1,t2,t3,t4,t5) typelist//計算typelist長度

//大多數typelist的操作都是基於遞迴,遞迴終止條件通過模板特化實現。

templatestruct length;

template<>struct length//length的全特化,即,只匹配nulltype。;};

templatestruct length>//length的扁特化,可匹配任何typelist型別,包括u同時也是typelist的復合情況。;};

//2 索引式訪問

template struct typeat;

templatestruct typeat,0>

;templatestruct typeat,i>

;//類似typeat功能,不過typeatnonstrict對逾界訪問更加寬容。

//比如typelist的個數是3,那麼你不能使用typeat::result,這樣會編譯錯誤。

//但是typeatnonstrict::result可以,如果不存在索引為3的type,那麼結果是第三個引數即nulltype

template struct typeatnonstrict

;template struct typeatnonstrict< typelist, 0, deftype >

;template struct typeatnonstrict< typelist, i, deftype >

;//3 查詢typelist

templatestruct indexof;//宣告

templatestruct indexof//如果tlist為nulltype,那麼令value = -1;;};

templatestruct indexof,t>//如果t是tlist中的頭端,那麼令value= 0;;};

template//將indexof施於tlist尾端和t,並將結果置於乙個臨時變數temp

struct indexof,t>//如果temp為-1,令value為-1,否則令value為1+temp

;//temp要先於value宣告定義。

public:

enum;

};//4 附加元素到typelist;;

;template//否則,如果tlist是non-null,那麼result將是個typelist,以tlist::head

;//5 reverse

template struct reverse;

template <>struct reverse;

template struct reverse< typelist>

;#endif

測試void typelists_test()

{ typedef typelist_0() tl0;

typedef typelist_3(char,int,double) tl3;

typedef typelist_3(char,int,double) tl3_1;

//length

std::cout<::value<::value<::result parm1;

typedef typeat::result parm2;

typedef typeat::result parm3;

typedef typeatnonstrict::result test_type;

std::cout<<"parm1 type:"<::value<::value<::value<::value<::value<::result).name()<

C 泛型程式設計 Typelists型別工具

typelists是乙個用來操作一大群型別的c 工具,就像lists對數值提供各種基本操作一樣。1.定義typelists typelist是以一種特殊的型別結束 nulltype class nulltype struct emptytype could be instantiated templ...

泛型程式設計之泛型引數

問題 用c 語言實現求乙個數的平方。分析 乙個數,可以是int double complex等,規則求數的平方 x x 偽 sqrt x return x x 實現一 提供一組用於求不同數字型別的平方函式。int sqrtint int x int sqrtdouble double x 實現二 上...

泛型程式設計之2

題 解釋一下什麼是泛型程式設計,泛型程式設計和c 及stl的關係是什麼?並且,你是怎麼在c 環境裡進行泛型程式設計的?美國某著名cpu生產公司面試題 答案 泛型程式設計是一種基於發現高效率演算法的最抽象表示的程式設計方法。也就是說,以演算法為起點並尋找能使其工作且有效率工作的最一般的必要條件集。令人...