2013-09-11 5 views
0

This answer forward объявить шаблонный класс Memo одним способом и реализовать его частичную специализацию по-другому.Разрешено изменять аргументы шаблона в специализированной специализации?

Итак, вперед декларация:

template <template <typename...> class Container, typename...> struct Memo; 

и частичная специализация это:

template <typename R, typename... Args, template <typename...> class Container> 
struct Memo<Container, R, std::tuple<Args...>> 

Шаблон аргумент Контейнер переключается с VARIADIC аргумент шаблона (надеюсь, кто-то понял, что я просто написал). R - это только первый элемент в пакете.

Код компилируется в порядке, поэтому я предполагаю, что должно быть просто объяснено, почему это разрешено делать.

Итак, почему разрешено изменять аргументы шаблона в специализированной специализации? Это потому, что специализация шаблона является независимым типом?

+0

Если вы говорите о ' class Container>' - порядок здесь не имеет значения. – jrok

+6

Частичная специализация сама по себе является шаблоном. Его собственные параметры шаблона не связаны с тем шаблоном, который специализируется. Как вы можете видеть, исходные параметры шаблона отображаются в порядке совпадения: 'Memo >'. А именно, 'Container' соответствует' Container', а 'R, std :: tuple ' - это двухэлементный пакет, соответствующий пакету. –

+0

@jrok Вот что я не понял. Я думал, что порядок имеет значение, когда вы специализируетесь на шаблоне. –

ответ

0

Порядок шаблонных аргументов в частичной специализированной специализации не имеет значения. Это объясняется тем, что частичная специализация шаблонов на самом деле не является шаблоном, это только специализация существующего шаблона.
Это означает, что набор параметров шаблона частичной специализированной шаблоны не являются параметрами шаблона, - это только объявление набора общих параметров, которые специализация использует/нуждается в.

Рассмотрим примера:

// A typelist template: 
template<typename... Ts> 
struct type_list {}; 

// A metafunction for concatenating typelists (Forward declaration): 
template<typename LIST1 , typename LIST2> 
struct concat; 

//The partial specialization of that template for typelists: 
template<typename... Ts , typename... Us> 
struct concat<type_list<Ts...> , type_list<Us...>> 
{ 
    using result = type_list<Ts...,Us...>; 
}; 

В частичной специализации concat metafunction, что мы делаем, чтобы специализировать шаблон для двух неопределенных списков типов. Таким образом, параметры шаблона typelits не определены, то есть являются общими. И нам нужно «объявить», что общие параметры перед его использованием.
Рассмотрите параметры шаблона частичной специализированности шаблонов только в качестве деклараций общих параграфов, которым нужна специализация. Поскольку нет реальных параметров шаблона, у них нет ограничений параметров шаблона. Обратите внимание: в специализации я использовал два вариационных пакета, которые не допускаются в шаблоне.

+0

специализированный шаблонный класс в вопросе является шаблоном. То, что вы написали, не совсем верно. Дело в том, что специализированный шаблон (шаблон или нет) является типом (почти) независимым от класса шаблона, который он специализирует –

Смежные вопросы