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...