2011-01-10 7 views
2

는 :전문화 및 템플릿 템플릿 매개 변수

template <template <typename, typename> class C, class T, class A > 
class TTCTest 
{ 
public: 
     TTCTest(C<T, A> parameter) { /* ... some stuff... */ } 
     C<T, A> _collection; 
}; 

나는 T와 클래스 (각각 경로 및 할당) 특정 유형의 어디에 템플릿 만 인스턴스화되어 있는지 확인합니다. 예를 들어

:

... 
list<path, allocator<path> > list1; 
list<int, allocator<int> > list2; 

TTCTest<list> testvar(list1); // ...should work 
TTCTest<list> testvar(list2); // ...should not work 
... 

이 가능하며 구문은 무엇인가?

감사합니다, 골

+0

하시기 바랍니다. – bluish

+0

죄송합니다 - 다음에해야 할 일입니다. – ColB

+0

C와 T가 항상 경로와 할당 자 여야 만한다면 템플릿 매개 변수 여야하는 이유는 무엇입니까? – stijn

답변

2

비 전문화 된 사례에 대한 구현을 제공하지 못한 부분 전문화로 수행 할 수 있습니다. 예를 들어
:

아니라 제목을 작성하고 당신이 쉽게 읽을 수있는 방식으로 코드를 포맷 할 수있는 경우 (편집기의 도구 모음을 사용하여) 적어도
template <template <typename, typename> class C, class T, class A > 
class TTCTest; 

template <template <typename, typename> class C> 
class TTCTest<C, path, allocator<path> > 
{ 
    // ... 
}; 
+0

Bart에게 감사 드려요. 그게 바로 제가 이루고자하는 목표입니다. 불행히도 그 구문은 VS2005에서 실패합니다. :-( – ColB

+0

나쁘다! 나의 실수 - 그건 정말로 효과가있다. – ColB

0

당신은 인스턴스화를 제약 조건 특성 클래스를 만들 수 있습니다. 예를 들어, TTCTest 건설 만에 path 유형을 제한 :

template<class T, class A> class path {}; 
template<class T, class A> class not_path {}; 

template<class T> class allocation {}; 

template<class T> 
struct Testable; 

template<class T, class A> 
struct Testable<path<T,A> > {}; 

template <template <typename, typename> class C, 
class T, class A > 
class TTCTest 
{ 
public: 
     TTCTest(C<T, A> parameter, Testable<C<T,A> > = Testable<C<T,A> >()); 
     C<T, A> _collection; 
}; 

void foo() 
{ 
    path<int, allocation<int> > p; 
    TTCTest<path, int, allocation<int> > t(p); // compiles 

    not_path<int, allocation<int> > np; 
    TTCTest<not_path, int, allocation<int> > t1(np); // fails 
} 

편집 : 당신은 당신이 필요로하는 모든 그것과 같을 것이다 경우에 부분 특수화이라고 나중에 표시된 이후 :

template <class T, class A > 
class TTCTest<path, T, A> 
{ 
public: 
     TTCTest(path<T, A> parameter); 
     path<T, A> _collection; 
};