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

2021-06-09 02:43:26 字數 3769 閱讀 3959

typelists是乙個用來操作一大群型別的c++工具,就像lists對數值提供各種基本操作一樣。

1.定義typelists

typelist是以一種特殊的型別結束:nulltype

class nulltype {};

struct emptytype {}; // could be instantiated

template struct typelist

;

下面我們可以定義以nulltype結束的型別,每個typelist都必須以nulltype結尾。nulltype可以視為乙個結束記號,類似'\0'的功能。

typedef typelist< char, typelist> > charlist;

注:typelists內部沒有任何數值:他們的實體是空的,不含任何的狀態,也未定義任何的函式。執行期間typelists也不帶任何數值。它們存在的理由只是為了可攜式別資訊。因此,對typelist的任何

處理都一定發生在編譯期而不是執行期。

2.將typelist的生成線性化

用巨集來將遞迴形式轉化成比較簡單的列舉形式,取代比較冗長的的重複動作。loki把typelists的長度擴充到了50.

#define typelist_1(t1) ::loki::typelist#define typelist_2(t1, t2) ::loki::typelist#define typelist_3(t1, t2, t3) ::loki::typelist#define typelist_4(t1, t2, t3, t4) \

::loki::typelist

現在可以用簡單的方式定義charlist了

typedef typelist_3(char, signed char, unsigned char)  charlist;

3.計算長度

假設tlist typelist,它有乙個編譯期常數代表其長度。因為typelists是一種靜態構件,所以這個與typelists相關的計算在編譯期完成。計算typelist長度的**如下:

//

// 長度

//template struct length;

template <>

struct length//length的全特化,只匹配nulltype;};

template struct length > //length的偏特化,可以匹配任何typelist型別,包括複合型

;};

4.索引訪問

乙個帶有索引操作的template的宣告式如下:

templatestruct typeat;

typeat:

輸入:typelist tlist,索引值i

輸出:內部某型別result

如果tlist不為null且i=0,那麼result就是tlist的頭部

否則如果tlist不為null且i不為0,那麼result就是將typeat施行於tlist尾端及i-1的結果

否則越界訪問,造成編譯錯誤。

typeat的演算法如下:

template struct typeat< typelist, 0>

;template struct typeat< typelist;

5.查詢typelists

流程如下:

if tlist is nulltype then -1

if the head is t then 0

if indexof(tail,t)==-1 then -1

else indexof(tail,t)+1

演算法如下:

template struct indexof;

template struct indexof< nulltype, t>;};

template struct indexof< typelist, t>

;public:

enum ;

};

6.附加元素到typelist

//

//template <>;;

;;

7.移除typelist中的某個元素

//

// erase

//template struct erase;

template struct erase< nulltype, t>

;template struct erase< typelist, t>

;template struct erase< typelist, t>

;

使用方法:

typedef erase::result somesignedtypes;

移除所有的元素:

template struct eraseall;

template struct eraseall;

template struct eraseall, t>

;

template struct eraseall, t>

;

8.移除重複的元素

template struct noduplicates;

template <> struct noduplicates;

template >

;

9.取代typelist中的某個元素(以型別u取代型別t)

template struct replace;

template struct replace;

template struct replace, t, u>

;

template struct replace, t, u>

;

10. 為typelists區域性更換次序

讓派生型別出現在基礎型別之前。mostderived演算法接受乙個typelist和乙個base型別,傳回typelist中base的最深層派生型別。如果找不到任何派生型別,就返回base自己。

如下:

template struct mostderived;

template struct mostderived;

、template struct mostderived, t>

;

derivedtofront演算法是以mostderivedwei為基礎,如下:

template struct derivedtofront;

template <>

struct derivedtofront;

template struct derivedtofront< typelist>

;

derivedtofront轉換可以高效的將「型別處理工序」自動化。

c 泛型程式設計 之 TypeLists

完整 在 關於 c 泛型中的 typetraits 參考 c 泛型程式設計 之 typetraits ifndef type lists h define type lists h include include include typetraits.h typelists 內部沒有任何數值 val...

C 泛型 泛型類擴充套件

泛型 更準確的使用一種以上的型別 方式 泛型允許我們宣告型別引數化的 我們可以用不同的型別進行例項化 也就是說,我們可以用 型別佔位符 型別引數 來宣告,然後在建立例項時提供真實型別 泛型不是型別,而是型別的模板 c 提供了5種泛型 類 結構 介面 委託和方法。前面四個是型別,方法是成員。一 泛型類...

《C 高階程式設計》之泛型 1建立泛型類

net自從2.0版本開始就支援泛型。閒話休提,馬上來看下非泛型的簡化鍊錶類,它可以包含任意型別的物件。linkedlistnode.cs中 在鍊錶中,乙個元素引用另乙個元素,所以必須建立乙個類,將其封裝在鍊錶中,並引用下乙個物件。1 public class linkedlistnode27 8pu...