Специализация и параметры шаблона шаблона

У меня есть следующее:

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;
};
Другие вопросы по тегам