這幾天用template的鬱悶和自己的無知(2)

2021-05-10 04:26:26 字數 1403 閱讀 7250

3. c++ type traits

一直比較奇怪這個是幹什麼的,現在總算略知皮毛。現在就讀陳崴先生翻譯的 和 john maddock and steve cleary 的 c++ type traits 做點筆記。

「總有一些時候,泛型不夠好 ─ 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本。」

也就是在這種時候,我們要對泛型做一些縫縫補補的工作。

traits 就是 「把一系列與型別相關的性質包裹於單一 class 之內」

「所謂特性(trait)指的是,舉個例子,某型別是否為乙個 pointer,或是乙個 reference?某型別是否擁有乙個 trivial constructor,或是擁有乙個 const 修飾詞? 這些 type-traits classes 共同享有一致性的設計:每乙個 class 都有乙個 member value,那是乙個編譯期常數,如果某型別擁有某種特性,此一常數的值就是 true,否則就是 false。」

traits實現這個member value的時候常常用到前面折騰了我一陣的特化,先提供乙個標準的主機板本的template class ,然後針對那些不好處理的做特化版本。

c++ boost中的type-traits library 是traits最典型的例子

最簡單的例子

is_void有乙個 member value,如果 t 是 void,它就是 true。

template  

struct is_void

;template <>

struct is_void

;

這裡是利用全特化來設計的,內部沒有實際用到模板引數,看上去有點傻,呵呵。
還有乙個例子是class boost::is_pointer
template  

struct is_pointer

;template

struct is_pointer

;

再摘錄一段有用的:
偏特化的語法帶了點不可思議的味道,而且一談到它很容易就耗掉一整篇文章。就像全特化的情形一樣,為了針對某個 class 寫出乙個偏特化版本,你首先必須宣告 template 主版本。偏特化版本在 class 名稱之後多出乙個 <┅> ,其中內含偏特化叄數;這些叄數定義出「將被繫結於偏特化版」的某些型別。究竟什麼叄數會(或說能夠)出現於偏特化版本之中,規則頗為曲折,以下是乙個簡略的規則。如果你能夠以此型式合法寫出兩個多載化函式:

void foo(t);

void foo(u);

那麼你就能夠以此型式寫出乙個偏特化版本:

template 

class c;

template

class c;

這個簡則並非絕對成立,但它非常簡單,足以讓你牢牢記住並足夠接近精確的規則。

這幾天用template的鬱悶和自己的無知(1)

想做乙個自己的元胞自動機模板庫,結果就把自己搞暈了 1.template template parameters 想在模板類中封裝乙個容器,容器的型別可以由使用者指定,容器中元素的型別也可以由使用者指定。於是想當然而 template class cellcontainer containertyp...

這幾天用多執行緒

系統正式開發有大半個月了,由於有非常多的loader需要同時執行,所以選擇多執行緒來實現。伺服程序m首先建立若干個s程序 如果有服務請求到達,m建立服務執行緒e。e和s之間用fifo用以傳遞資料。當有資料到達之後,e通過fifo傳給s,s啟動乙個執行緒loader loader和s之間也是fifo ...

這幾天用linux的體驗

買了張16gb的u盤。每天就不厭其煩的拼命往上面裝各種發行版的linux作業系統的live版本。先用unetbootin把映象寫進去以後,再開機去開啟那個live版的系統,再把它裝在硬碟上面 硬碟已經被我清空了一部分的 第乙個發行版是backtrack5 r2 gnome,這是我用的最久也是最舒服的...