2012-10-16 159 views
5

我有一個關於我最近拿在手中的代碼的問題。我只是想知道,如果在C++模板範例是正確的或有用做以下繼承(只有3類爲例):從模板繼承C++


template< class I, class P, class D, unsigned int ID = 0 > 
class PathFilter : public Filter< I, P, 1 > 
{ 
... 
} 

template< class I, class A, unsigned int N = 1 > 
class Filter : public Algorithm< I, A > 
{ 
... 
} 

template< class I, class A > 
class Algorithm : public A //This line 
{ 
    ... 
} 

我的問題是關於特別在第三個例子繼承。使它如此「通用」而不精確是否有用?通過更通用的代碼危害可理解的代碼是一個很好的選擇?

我問首先是因爲我沒有C++模板方面的專家,也是因爲我看到這個代碼難於使用模板來理解(通常是模板的名字隻字不提其內容)。有什麼建議?

回答

2

你在做什麼是混合類(特別是你的Algorithm類是一個)。

作爲一個參考,你可以參考,比如,http://en.wikipedia.org/wiki/Mixinhttp://en.wikipedia.org/wiki/Composite_pattern

事實上,您正在指定「某些功能(由A指定)被繼承或僅由子類重用(即Algorithm)」。 (從第一篇文章中引用)

換句話說,您正在讓自己(或您的用戶)免費添加或以某種方式將行爲更改爲「之後」。您的真正收穫是僅依靠編譯器而不是某些類似於動態綁定的機制(例如,覆蓋虛擬函數)來實現這種靈活性。你的最後一類Algorithm<A>,實際上是在編譯時建造,它是可能一樣有效,你會獲得寫Algorithm<A>明確的類(即明確包括手工寫它政策AAlgorithm)。

編輯

我還建議給一看就有關基於政策設計這個維基百科頁面(http://en.wikipedia.org/wiki/Policy-based_design)。

還有,政策名稱(您A)出現在一個明確的形式,有明確的名稱,因爲明智地@ full.stack.ex建議。

+1

所以,如果這就是你想要的,很好。至於可讀性,確實,有一個古怪的命名模板參數的傳統 - I,P,A等,但你不必:)。給他們更好的名字,他們可能會變得自我描述。 –

+1

感謝您的回答,但我仍然有一個問題。我理解使用「更高」類中某些功能的一般抽象定義。但模板的主要目標不是泛化參數類型?所以我最後說的是我可以將幾乎所有東西都傳遞給這個更高級的類,並保留一個更低層次的函數。最後,我將擁有一組非常有限的對象,可以繼承(也許是一個)較低級別的功能,我錯了嗎?定義該通用性不是不切實際的方法? –