Специализация и параметры шаблона шаблона
У меня есть следующее:
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 и A имеют определенный тип (соответственно путь и распределитель).
Например:
...
list<path, allocator<path> > list1;
list<int, allocator<int> > list2;
TTCTest<list> testvar(list1); // ...should work
TTCTest<list> testvar(list2); // ...should not work
...
Возможно ли это и каков синтаксис?
С уважением, Col
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> >
{
// ...
};
Вы можете создать класс свойств для создания экземпляров ограничений. Например, ограничьте вашу конструкцию 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;
};