2011-01-10 5 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; 
}; 

Я хочу, чтобы убедиться, что шаблон только экземпляров, где Т и А классы определенного типа (путь и распределителя соответственно).

Например:

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

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

Возможно ли это и что такое синтаксис?

С уважением, Col

+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

Спасибо, Барт - это именно то, чего я пытаюсь достичь. К сожалению, этот синтаксис не работает на VS2005. :-( – ColB

+0

Мне плохо! Моя ошибка - это действительно работает. – ColB

0

Вы можете создать черт класс Constraint инстанциации. Например, ограничить ваше 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 
} 

Edit: Поскольку позже вы указали, что все, что вам может понадобиться частичная специализация, в этом случае она будет выглядеть следующим образом:

template <class T, class A > 
class TTCTest<path, T, A> 
{ 
public: 
     TTCTest(path<T, A> parameter); 
     path<T, A> _collection; 
}; 
Смежные вопросы