※ 引述《milochen.bbs@ptt.cc (邪樹豬鹿)》之銘言:
> 之前也是有看這一類的書,也想說能夠從這些書中學一學怎樣寫出跟書上一樣有趣的
> template…
> 不過等真的在寫的時候,發現理論與實際有天與地的差別,或者是說書上寫的
> 不見得自己的complier就能夠,有時候沒過,也不知道該從何查起
現代的 compiler 應該都不會這麼慘了,
msvc 8.0 我是不清楚(請參考前面板友說的話),
gcc 4.1, 4.2, 4.3 其實都能編過大部分的東西了,
另外就是請稍微注意一下自己的 compiler 有沒有 template 深度限制,
通常都會有參數可以調,
gcc 是用 -ftemplate-depth-n,
不過要注意標準不接受超過 17 層以上的深度。
> 有時候會想說,是不是要寫template之前,要先搞懂每個complier對於template寫法的
> 接收度到底在那邊… 不過其實也不知道到底這方面資訊要去那裡找。
學的時候有乖乖練習的話其實都會發現,
另外就是真的不要用太舊的 compiler。
> 反而就變成一直在try and error… try到最後會發現,原本當初理想的template的規則
> 似乎已經變成說是自己在那邊try and error。而之後想要寫程式的時候,就拿那固定
> 幾種 曾經使用 成功過的方法, 來重覆使用。
我印象中沒有這麼嚴重,
可能單純只是程式碼撰寫錯誤,
耐心去看錯誤訊息也是一種學習的必經之路,
如果因為 compiler 吐了十幾頁 error 就被嚇到的話,
那就表示還必須再多磨練,
其實基礎夠穩的話那些也只不過是數量多而已。
不過許多 compiler 在 template 相關的 error messages 上不友善的輸出,
一直也是一個問題,
是有人寫了一些小工具可以把 error messages 導進去整理後重新輸出,
但是終究還是不怎麼好用。
> 但是對於 如何 利用 template 規則,來創造出 許多像Modern C++ Design 這本書
> 一樣的夢幻code。 真的是還有好大的一段距離,
> 關於這點其實我一直不知道怎麼克服,總覺得看書去理解是一回事
沒有真正寫過中型規模系統的初學者,
絕對是不可能一讀完書就能憑空造出那樣的 code 來,
建議先用看過書之前的方式來撰寫,
然後再來一步一步的去改(建議使用 CVS 等版本控制系統),
最大的禁忌就是一心一意的想一步登天,
沒有人一開始就能搞出那麼漂亮的東西,
這也正是為什麼這種書會從基礎開始教起的原因,
它是為了讓你看過這樣的演進過程,
然後你自己也要真的把你自己的東西照著演進一次,
並將這個過程的心得與書上印證和比較,
而不是希望你看完以後就能馬上寫出那種 code。
> 但發現自己反而是花更多的時間,是拿著自己的template code去
> try and error 一個 跟本就不知道它會怎麼處置 template的黑盒子。
> 不知道有沒有大大也曾有類似這樣子的經驗的。
這個我可能沒辦法回答你,
除了直接看 error messages 外,
因為我本身有在接觸 gcc 的 source code,
所以就算真的碰到不能理解的狀況也能從 gcc 的 generic/gimple tree 去追,
我也很好奇使用非 open source 的 compiler 做這些事的人,
是怎麼樣去解決的。
但我並不會用 try & error 的方法去做,
而是先解讀錯誤訊息後再來看問題到底出在哪,
如果你說只是完全沒頭緒的 try & error,
那樣是很不好又浪費時間的行為。
> 通常像遇到這種情形的時候,我們要怎樣的規劃,才可以在學習template的路上
> 或得更有效率的學習,並且能夠實際應用在開發大型系統上。
我的方法是改寫過去寫過的東西,
我習慣每次看完一本書就會去強化我寫過的東西。
> Modern C++ Design 一書,慢慢看的話,其實真的是不難懂
> 但是實際Coding的時候 compile 能不能接受 這語法才是最頭痛的問題,
> 常常會困在說「是compiler 剛好不支援這樣寫的方式,還是我寫的方式本來就不合法」
你可以貼上來大家去 try try 看,
但是根據我的經驗,
要是 compiler 沒有吐出平常沒看過的錯誤訊息,
那通常都是跟自己寫錯有關,
耐心看錯誤訊息就可解決。
另外就是前幾年開始就存在一個過渡期,
就是 C++ compiler 對 typename 的出現要求很嚴,
標準規定不該省略的地方就一定不要省略,
不然很容易就會死掉。
> 因為實際是找不到方法,所以....想在此請教曾經有克服這段經驗的大大....
> 我在猜我是不是學習的方法有什麼嚴重錯誤而不自知??
學會看懂所有錯誤訊息是第一步吧,
我想這點應該沒什麼爭議,
另外就是不要先懷疑 compiler 沒支援。
> 希望 能夠 在 Modern C++ Design 讀書會下,透過大家一起討論的方式,
> 理想是能夠抓住GoF的方法,把Modern C++ Design 的精隨舉一反三的方式
> 可以實際的把這精巧的元素 真的直接用於 系統的開發上。
> ........感恩.....
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage: https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮ < IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰ * From:61-230-223-213.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 ◎