2016-10-14 1 views
0

은 가능합니까?특수 버전이 원래 템플릿 클래스와 일부 기능을 공유 할 수 있습니까? 클래스의 전문 버전의 일부 또는 원본 템플릿 클래스의 모든 기능을 공유 할 수

즉 템플릿 클래스가 고려

,

template <typename T> 
class A 
{ 
    A() 
    {} 
    A(const A& ref) 
    {} 
    void f1() 
    { 
     //do something 
    } 
    void f2() 
    { 
     //do something 
    } 
    void f3() 
    { 
     //do something 
    } 
} 

그리고 그것은 단지뿐만 아니라 일반 버전으로 원래의 일반적인 기능을 몇 가지 추가 기능을 추가하려는 특정 데이터 유형에 대한 전문 버전이 있습니다.

template<> 
class A<int> 
{ 
    void f4() 
    { 
     //do something 
    } 
} 

이제이 전문 버전은 가능하면 생성자를 포함한 일반 버전의 모든 것을 공유해야합니다. 유도에 지나지 구성된 템플릿 클래스와,

template <typename T> 
class A_base 
{ 
    // All the f1() functions, et. al, implemented here 
}; 

template<typename T> class A : public A_base<T> { 

public: 

    // An empty shell of a class, with the constructor 
    // forwarding its arguments to the superclass. 

    template<typename ...Args> A(Args && ...args) 
      : A_base(std::forward<Args>(args)...) 
    { 
    } 
}; 

template<> 
class A<int> : public A_base<int> 
{ 
    // Same constructor. 

    void f4() 
    { 
     //do something 
    } 
}; 

당신은 기본 클래스로 모든 클래스 메소드, 클래스 멤버, 이동 결국 :

+2

아마 상속은 더 나은 선택이 여기에? –

+0

아니, 원하는만큼 똑바로 진행할 수는 없습니다. 이 점을 염두에 두십시오. 각 템플릿 특수화 컴파일러에 대한 다른 종류의 (따라서 이름 (로, 별도의 클래스 정의이다 상관없이 그들이 당신에 같은 이름을 가진 것으로 보면 –

+0

경우 당신이 인식하지 못하는 것, 그것은으로 가능 전체 클래스를 전문화하지 않고 클래스 템플릿의 개별 기능을 전문화합니다. –

답변

1

이 클래스 계층 구조를 구조 조정하여 해당를 구현하는 것이 가능하다 기본 클래스 템플릿에서; 그렇지 않으면 빈 외관.

그런 다음, 전문화는 기본 클래스에서 같은 방법을 유도하고, 자신의 방법을 추가합니다.

또 다른 대안은 "뒤로"유도의이 종류를 구현하는 것입니다.

// Empty template class. 

template<typename T> class A_extra {}; 

// Your specialization, with the extra method: 

template<> 
class A_extra<int> { 

    void f4() 
    { 
    } 
}; 

// And the template class inherits from it: 

template<typename T> class A : public A_extra<T> { 

    // Your template class 
}; 

템플릿 클래스의 세부 사항에 따라 하나 또는 다른 접근 방식이 작동해야합니다. 또는 동일한 주제에 약간 변이.

관련 문제