2010-01-13 86 views
7

我試圖解決一個問題,但發現了一個不同的解決方案。然而 出於好奇想知道,如果以下是可能的:從非專業版本繼承C++專業模板

template<class> struct S; 
template< > struct S<Foo> : struct<Foo> {}; 

我希望能夠繼承非專業化結構從上面的專業例如struct.the不起作用,因爲繼承的結構是專業的,領先到無限遞歸。

一個可能的解決方案是添加第二個模板參數,比如說bool專用的,這樣默認值爲false,專用模板具有該參數爲true。但是由於實例化需要指定附加參數,所以事情有點麻煩。

有沒有其他的方法來實現上述?

最初的問題是實現矩陣的矩陣,其中矩陣本身可能有額外的運算符,這取決於組成矩陣是否具有這些運算符。我希望這是有道理的。同時不同的專用矩陣需要保持相同的名稱,但具有不同的模板參數的同一基礎類。我曾經想過可能有辦法做到這一點使用enable_if和型性狀

+3

第一個反問題是你想用這個解決什麼樣的問題? – 2010-01-13 20:15:31

回答

2

一個可行的辦法是添加第二個模板參數,說BOOL專業化,使得默認是假的,和專業的模板有參數true,但由於實例化需要指定附加參數,所以這使事情有點麻煩。

你可以做template<class Foo, bool flag = false>,所以第二個參數是可選的。

5

你可以保持在一個單獨的類型的所有通用的東西,並延長與您的專業:

template <typename> struct S_generic { /* generic stuff here */ }; 

template <typename T> struct S : public S_generic<T> { /* nothing here */ }; 
template <> struct S<Foo> : public S_generic<Foo> { /* extra stuff here */ }; 

編輯:另外,如果你不喜歡多餘的名字,順便用在實例化模板時沒有混亂的額外標誌是使用默認值:

template <typename T, bool fully_defined=true> struct S; 
template <typename T> struct S<T,false> { /* generic stuff here */ }; 

template <typename T> struct S<T,true> : public S<T,false> {}; 
template <> struct S<Foo,true> : public S<Foo,false> { /* extra stuff here */ }; 
+0

這就是我最終做的。我試圖避免的是有兩個不同的名字。我認爲可能有一種方法可以使用enable_if和type特徵來實現它。 – Anycorn 2010-01-13 20:31:21

+0

沒有理由添加enable_if或type特徵的所有額外複雜功能,只需使用非專業化和專業化可以繼承的通用基礎。 'BlahBase'或'blah_base'很常見。 – 2010-01-13 20:50:06

+0

在這一點上,它並不是很實際的問題,因爲好奇心問題,「我想知道它是否可以做到這一點?」。 – Anycorn 2010-01-13 20:57:41