2012-08-16 58 views
3

我知道模板的要點是推廣您的代碼,但是我希望該類的一個特定成員函數根據創建的對象類型作出不同的反應。 具體而言,我創建了一個Class Dictionary,用於創建DictionaryNoun或DictionaryAdjective對象。我有我想有一個代碼結構如下字典::打印():C++我有一個模板類,有一個方法print(),我需要根據類型採取不同的行爲

Dictionary::print(){ 
    if(this is a Dictionary<Noun> object){ 
     // Print my nouns in some special way 
    } 
    if(this is a Dictionary<Adjective> object){ 
     // Print my adjectives in some special way 
    } 
    else{ //Print objects in default way} 
} 

我的問題是我怎麼做我的對象類型檢查?

+0

我假設你的意思是寫'模板無效字典 ::打印(){...}' – David 2012-08-16 22:35:40

回答

5

C++讓您可以專門爲特定模板參數指定成員函數。通過寫

template <> 
    void Dictionary<Noun>::print() { 
    /* ... special code for printing nouns ... */ 
} 

您可以專門爲Adjective以同樣的方式

template <typename T> class Dictionary { 
    /* ... */ 
}; 

然後你就可以專注什麼呢printDictionary<Noun>:例如,如果你有這樣的事情。最後,你可以編寫一個默認實現,如果兩者都不匹配,可以使用

template <typename T> 
    void Dictionary<T>::print() { 
    /* ... catch-all code ... */ 
} 

希望這有助於!

+0

優秀。這正是我想要的。 – user1600812 2012-08-16 22:39:34

+0

如果專業化在頭部,他們應該是'inline'。如果它們在一個實現文件中,那麼你必須在頭文件中提供一個聲明來禁用隱式實例化。對模板成員函數的專業化還有其他潛在的有害副作用,因爲在遇到專業化之後,您不能再專門化該類。 – 2012-08-16 23:41:56

1

您不需要用於函數(或方法)重載的模板。

void print(std::ostream &os, const Noun &v) {} 
void print(std::ostream &os, const Adjective &v) {} 

雖然你需要一個模板作爲一個包羅萬象的。

template<typename T> 
    void print(std::stream &os, const T &v) {} 
+0

+1我不明白downvote。這個答案比接受的答案更有意義。只要'Dictionary :: print'轉發請求,將每種類型的元素打印到這些外部函數中。這使得更簡單的代碼在將來得以維護。功能專業化有一些奇怪的副作用(例如,一旦你爲一個功能提供專門化,你就不能再專門化這個類模板) – 2012-08-16 23:35:55

2

雖然可以使用專門化處理這個問題,我認爲,設計會更好,如果不是,你執行中的元素(NounAdjective)實際打印,則有Dictionary<T>::print遍歷容器調用適當的過載/成員功能。

void print(std::ostream& o, Noun const & n); 
void print(std::ostream& o, Adjective const & a); 
// Alternatively 
// void Noun::print(std::ostream&); 
// void Adjective::print(std::ostream&); 

template <typename T> 
void Dictionary<T>::print(std::ostream& o) { 
    // iterate over all elements: 
    for (T const& r : container) { 
     print(o, r); 
     // alternatively: r.print(o); 
    } 
} 
相關問題