Re: [問題] Class Template vs Dynamic Binding
※ 引述《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
08/04 01:33, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):