2012-06-19 6 views
1

나는이 일을 할 수 없다.템플릿의 부분 템플릿 전문화

나는 기존 템플릿이 있습니다

template <class T> 
class MyTemplate; 

지금 나는 그것을 전문으로하기를 원하지만 클래스 T에 대한 템플릿의 그 - 상기 제 2 템플릿을 전문으로하지 않고, 예를 들면 :

template <> 
template <class T> 
class MyTemplate<vector> { /*...*/ }; 

하지만 이것과 다른 시도한 구문은 컴파일하지 않는 것 같습니다. 이 구문은 무엇입니까? 또는 심지어 가능합니까? 그렇지 않다면 MyTemplate에 대한 대안이 있습니까? 예를 들어 vectormap에 대한 일반화 된 특수화를 처리 할 수 ​​있습니까?

답변

2

난 당신이 찾고있는 생각합니다.

2

올바른 구문은 다음과 같습니다 당신이 MyTemplate<vector<int> > x;T A가 int이다 할 때

template<typename T> 
class MyTemplate {...} 

template<typename T> 
class MyTemplate<vector<T> > {...} 

위의 부분 특수화가 사용됩니다

template < typename T> 
class MyTemplate<vector<T> > { /*...*/ }; 
1

보다 일반적

template<typename A, typename B> class MyTemplate; 
template<typename C, typename D> class SomeTemplate; 

template<typename A, typename C> 
class MyTemplate<A, SomeTemplate<C,A> > { /* ... */ }; 
0

템플릿을 환산하거나 정의 할 수

  • 비 타입 파라미터 (상수)
  • 형태 파라미터
  • 템플릿 파라미터
한 번만

그렇게 정의 된 모든 전문 분야는 매개 변수의 종류를 존중해야합니다.

template <typename T, typename Alloc> 
class MyTemplate < std::vector<T, Alloc> > { 
}; 
: 당신은 유형 매개 변수가 예상입니다 (템플릿)을 vector에 대한 전문하려는 경우

따라서, 당신은 입력 (템플릿) 매개 변수를 만들 수 vector의 매개 변수를 밖으로 철자 할 필요가 map에 대한 유사

더 많은 매개 변수가 있지만 :

template <typename K, typename V, typename C, typename A> 
class MyTemplate < std::map<K, V, C, A> > { 
}; 

여기 당신이 갈이 :

0

클래스 템플릿을 정의하는 구문에 대해 잘 모르겠습니다. 당신은 그것을 봐야합니다. 그러나 템플릿을 정의하는 것이 모두를 포착하는 것은 아닙니다. 각 템플릿에 대한 클래스 정의를 작성해야합니다. 예를 들어, x 유형의 1 인수를 말하고 y 유형 또는 2 등의 인수를 취하는 클래스 정의가있는 경우이를 처리 할 클래스가 필요합니다. 함수 오버로딩과 동일합니다. 당신은 같은 함수 이름을 가지고 있지만 각각 다른 인수를 취합니다. 당신은 각각에 대해 함수를 작성합니다. 그리고이 호출은 인수 목록을 기반으로 올바른 함수를 선택합니다.

그래서 클래스는 ... 각 유형을 정의하여 다른 객체를 정렬합니다.