2012-08-16 1 views
3

템플릿의 요점은 코드를 일반화하는 것이지만 그 클래스의 특정 멤버 함수가 어떤 유형의 객체가 만들어 졌는지에 따라 다르게 반응합니다. 특히 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

답변

5

C++에서는 특정 템플릿 인수에 대해 멤버 함수를 특수화 할 수 있습니다. 당신은 Adjective 같은 방법을 전문으로 할 수

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

를 작성하여

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

는 그런 다음 printDictionary<Noun>을 위해 무엇을 전문으로 할 수 있습니다 : 예를 들어, 다음과 같은 식으로되어 있어야합니다. 마지막으로, 쓰기로 일치하지 않는 경우 사용되는 기본 구현을 작성할 수 있습니다.

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

희망이 있습니다.

+0

우수를 작성하는 의미 가정합니다. 그것이 내가 원하는 것입니다. – user1600812

+0

특수화가 헤더에있는 경우 '인라인'이어야합니다. 구현 파일에있는 경우 암시 적 인스턴스화를 사용하지 않으려면 헤더에 선언을 제공해야합니다. 특수화가 발생한 후에 더 이상 클래스를 전문화 할 수 없으므로 템플릿의 구성원 함수의 특수화에는 잠재적으로 원치 않는 기타 부작용이 있습니다. –

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'를 사용하여 각 유형의 요소를 이러한 외부 함수에 인쇄하라는 요청을 전달하십시오. 따라서 앞으로는 더 단순한 코드를 유지 관리 할 수 ​​있습니다. 함수에 대한 전문화에는 * 이상한 * 부작용이 있습니다 (예 : 함수에 대한 특수화를 제공하면 더 이상 클래스 템플릿을 전문화 할 수 없음) –

2

, 내가 대신 그 당신이 그 다음을 호출하는 용기를 통해 Dictionary<T>::print으로 반복이 요소 (Noun, Adjective)의 실제 인쇄를 구현하는 경우 디자인이 더 좋을 것이라고 생각 적절한 오버로드/멤버 함수.

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); 
    } 
}