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 - это только первый элемент в пакете.
Код компилируется в порядке, поэтому я предполагаю, что должно быть просто объяснено, почему это разрешено делать.
Итак, почему разрешено изменять аргументы шаблона в специализированной специализации? Это потому, что специализация шаблона является независимым типом?
Если вы говорите о ' class Container>' - порядок здесь не имеет значения. –
jrok
Частичная специализация сама по себе является шаблоном. Его собственные параметры шаблона не связаны с тем шаблоном, который специализируется. Как вы можете видеть, исходные параметры шаблона отображаются в порядке совпадения: 'Memo>'. А именно, 'Container' соответствует' Container', а 'R, std :: tuple ' - это двухэлементный пакет, соответствующий пакету. –
@jrok Вот что я не понял. Я думал, что порядок имеет значение, когда вы специализируетесь на шаблоне. –