Специализация и параметры шаблона шаблона - PullRequest
2 голосов
/ 10 января 2011

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

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
...

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

С уважением, Кол

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Вы можете сделать это с частичной специализацией, когда вы не можете предоставить реализацию для неспециализированного случая.
Например:

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 голосов
/ 10 января 2011

Вы можете создать класс свойств для создания экземпляров ограничений.Например, ограничьте вашу конструкцию 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...