Re: [問題] Class Template vs Dynamic Binding

看板C_and_CPP作者 (meow)時間13年前 (2012/08/03 17:19), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《POSIX (tedium of chores)》之銘言: : 麻煩幫我觀念指證一下 m(_._)m : 最近遇到一個問題 : 因為我觀念不是很清楚 : 想麻煩各位大大解惑 : 先以n維度的點為例 : 1. 在使用template class 上 : 主要目的是為了減少code size(?) : 可能二維、三維、四維 : 那麼這樣的話 可以宣告 : template <Class T> : Class Node{ .. } : 之後再對二維、三維、四維分別宣告定義出相對應的class : 使用上再置入T 使用 或許你想要的是這個 template <unsigned int D> class Node { public: Node() : p_(0) {p_ = new double[D];} ~Node() {delete[] p_;} double pos(unsigned int d) {assert(d < D); return p_[d];} void set_pos(unsigned int d, double p) {assert(d < D); p_[d] = p;} private: double *p_; }; 但我覺得這種設計(或類似的設計)並不會太好用....... 事實上要對二維 三維 四維寫 template 是很困難的事情 因為這種數學模型的函數參數多半會隨著維度而增加 偏偏 template 不善於處理函數參數數目不同的情況 若是硬要處理 常常要使用麻煩的特化技巧 更重要的是 這種設計背離了 template 的存在意義 因為一來 特化一多 就相當於沒有做到多少 reuse 二來 數學上而言 對各種維度的演算法常常不盡相同 因此也得不到統一管理的維護優勢 到最後 你唯一做到的事情只是讓原來的三個類別 Node2D, Node3D, Node4D 換成另一組名字 Node<2>, Node<3>, Node<4> 而已.......XD 除非說你處理的是一個維度沒有限制的泛化問題 而且第 n維的演算法可以用第 (n - 1)維的演算法來遞迴定義 否則這種設計起不到太大的效果 (附帶一提 很多時候處理有限的不同維度問題 需要的只是對不同數量的參數作函式重載而已) : 2. 在使用dynamic binding 上 : 主要目的簡化繼承結構(?) : 方便以base class 的member function 來處理問題 : 目前是知道有這兩個東西可以使用 : 但是要用哪個 會決定程式之後寫法的走向 : 想要向各位請教 : 1)我的認知有沒有錯誤 >"< : 2)是什麼會決定這兩種寫法? virtual 和template 的最大差別 就是在於前者是執行期多型 後者是編譯期多型 所以你不確定時 可以先問自己「能不能在編譯期決定要叫誰?」 能在編譯期決定的 寫成template 否則寫成virtual template 的顯著例子當然是抽象化的資料結構及其相應演算法 這在使用STL時你應該已經體驗過了 virtual 則常見在「使用者呼叫誰我就做該物件的對應動作」這種情況 (畢竟使用者的行為不可能在編譯期決定嘛......) 當然 從一般常見的情況來說 你可能會覺得 virtual 總是搞出一組介面相同實做互異的群體 而 template 則多半會產生一組算法相同內容互異的群體...... 但事實上 如果你的多型可以在編譯期決定的話 template 一樣能夠解決「介面相同實做互異」的問題 有興趣的話可以閱讀一些相關書籍 例如 "C++ Templates - The Complete Guide" 等等 : 3)有沒有任何參考資料(類似design pattern?)之類的 你可以先看 "Effective C++" 裡面對這兩種多型的解釋很基礎 應該可以闡明你的觀念 (但我想 只有下去實作 才能體會這兩種多型各自有什麼限制和不便吧^^") -- 直接閱讀《琴劍六記》 http://gs.cathargraph.com/p/list.html   《琴劍六記》Facebook專頁 https://www.facebook.com/GSannals -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.85.123.240

08/04 01:31, , 1F
謝謝!確實點出我對沒有考慮到編譯期的盲點!非常受用!!
08/04 01:31, 1F

08/04 01:33, , 2F
對int 偏特化的手法還蠻漂亮的!忘記還可以用這招XD
08/04 01:33, 2F
文章代碼(AID): #1G70WSal (C_and_CPP)
文章代碼(AID): #1G70WSal (C_and_CPP)