2010-10-22 138 views
3

我發生了以下模式,並想知道是否有名稱?枚舉類

enum定義具體的類:

enum Fruits{ eApple, eBanana }; 

而一個模板struct提供了接口:

template< Fruit T > 
struct SomeFruit { 
    void eatIt() { // assert failure }; 
}; 

然後,我們可以實現具體類這樣的:

template<> 
struct SomeFruit<eApple> { 
    void eatIt() { // eat an apple }; 
}; 

template<> 
struct SomeFruit<eBanana> { 
    void eatIt() { // eat a banana }; 
}; 

而且使用它們:

SomeFruit< eApple> apple; 
apple.eatIt(); 
+0

我覺得這個部分沒用:「我們可以這樣實現具體的類:」。具體的類是使用'SomeFruit < eApple>蘋果;' – Andrey 2010-10-22 13:08:51

+0

實現的爲什麼不只是做一個'Apple'和'Banana'類? – GManNickG 2010-10-22 13:12:59

+0

@Andrey:注意,沒有那部分調用'apple.eatIt()'會導致'assert failure',而不是'吃蘋果'。 – dukedave 2010-10-22 14:26:11

回答

3

這通常使用這樣的(捕捉在編譯時的錯誤)

template< Fruit T > 
struct SomeFruit; 

template<> 
struct SomeFruit<eApple> { 
    void eatIt() { // eat an apple }; 
}; 

template<> 
struct SomeFruit<eBanana> { 
    void eatIt() { // eat a banana }; 
}; 

和通常被稱爲編譯時多態性(相對於運行時多態性,其在C++中使用虛擬功能來實現)。

1

我不知道名字,但你是不執行模板更好 - 只是宣稱,如果有人試圖實例它會拋出一個編譯錯誤:

template< Fruit T > 
struct SomeFruit; 
+1

是的,這是這種模式的愉快的副作用,這樣的錯誤將等同於「不能實例化抽象類」與香草類。 – dukedave 2010-10-22 14:32:42

+0

@Dave Tapley - 是的,這取決於你想要的。編譯或運行時錯誤。 – 2010-10-22 14:39:15

0

這就是所謂的模板專業化。在這種情況下,它是明確的(又稱完整)專業化,template <>認可,而不是部分專業化。

+0

正確,但是我對使用'enum'作爲模板參數獲得的模式感興趣,並且爲'enum'的每個值提供了完全的專門化。 – dukedave 2010-10-22 14:28:12

+0

@Dave Tapley:從來沒有遇到過這樣的具體名稱,如果其他人有興趣... – usta 2010-10-22 14:57:58