想做乙個自己的元胞自動機模板庫,結果就把自己搞暈了:
1. template template parameters
想在模板類中封裝乙個容器,容器的型別可以由使用者指定,容器中元素的型別也可以由使用者指定。
於是想當然而
template
class cellcontainer
containertypem_cellset;
想當然而的東西當然不對,通不過編譯,自己也知道,恐怕沒有這麼簡單解決。找了google這個最好的老師,搜到c++ common knowledge: essential intermediate programming這本書,還有電子版。原來這個技術叫做template template parameters,如獲至寶。
搗鼓了半天,這麼做了:
templateclass containertype>
class cellcontainer
containertypem_cellset;
template class 表示後面的那個containertype也是乙個模板類,而且是含有乙個模板引數的模板類。
光是模板類的編譯是通過了,不過對於模板來說,不到具現它的時候是說明不了問題的。
果然,cellcontainer
通過不了編譯。說是vector和模板不匹配。
再次想辦法,這回總算撿起《c++ template》這本經典了,(我的pdf板很差,不大高興看它)。
終於找到,原來,stl容器是有預設allocator的,只是我們從來不用,一律default。但是在這裡,必須要告訴編譯器,有兩個模板引數才行。
templatetemplate> class containertype>
class cellcontainer
;template> class
表示後面的containertype是乙個含有兩個模板引數的模板類,並且第二個模板引數預設為std::allocator
這樣才和stl的container對上了。
唉,還是自己學藝不精啊!stl基本的沒搞透徹。
2 template specialization
template給我們的力量在於:對不同的型別的一致性處理。
但是,在設計template function或者template class的時候,型別的行為並不一定就是我們所預期的那樣。當有的型別符合我們設計的意願,但是又不容易融合到我們的template中來的時候,我們可以特殊處理之,那就叫特化( specialization)。
例如(modern c++ design)中的例子
有模板類:
template
class widget
;針對特定的modaldialog, mycontroller類,我可以做特殊的處理:
template <>
class widget
; 這樣,當模板引數為modaldialog, mycontroller時,我們的widget的行為是後面特化後的行為。
如果,我們緊緊希望對mycontroller做特化,而這樣的特化適用於任意window與mycontroller的結合,那麼我們可以做偏特化:
partial template specialization
template
class widget
; 偏特化還有重要的乙個用途就是在處理類似指標行為的型別的時候:
看例子(c++ templates : the complete gui
templateclass list ;
這是乙個list的模板類,但有時我們希望乙個list中能存放不同型別的元素。在過去,我們利用指標void *做到這一點,
因為void*指標可以指向任意型別的物件。
型的型別,我們可以採用統一的演算法。於是,我們可以專門針對指標型的元素,做上述模板類的偏特化
templateclass listsize_t length() const
… };
不過這樣又帶來乙個問題,因為偏特化的過程中,乙個成員就是listimpl;為了能夠實現list本身,我們再針對list做乙個特化
template<>class list;
真是麻煩啊,感覺特化就是模板搞不定的事情的修修補補,畢竟靜態多型是演算法一致,型別不一致,但是演算法又是對型別有要求的,
所以搞起來還是比動態多型麻煩。但是template是麻煩模板設計者,幸福模板使用者的。對於使用者來說,能獲得又靈活又高效的庫
是一件幸福的事情。效率,彈性,簡單三大目標不可能兼得,c++取的是效率和彈性,簡單只能被放棄了。
這幾天用template的鬱悶和自己的無知(2)
3.c type traits 一直比較奇怪這個是幹什麼的,現在總算略知皮毛。現在就讀陳崴先生翻譯的 和 john maddock and steve cleary 的 c type traits 做點筆記。總有一些時候,泛型不夠好 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本。也就是...
這幾天用多執行緒
系統正式開發有大半個月了,由於有非常多的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,這是我用的最久也是最舒服的...