Я только начал изучать шаблоны, я просматривал пример, где реализован TypeList, и увидел эту реализацию метода Length для TypeList.
template <class TList> struct Length;
template <> struct Length<NullType>
{
enum { value = 0 };
};
template <class T, class U>
struct Length< Typelist<T, U> >
{
enum { value = 1 + Length<U>::value };
};
Мой вопрос заключается в том, что шаблон основной длины имеет только 1 параметр (TList), но специализация имеет 2 параметра. Как это возможно, я читал в других местах, чтобы специализация имела меньшее количество параметров
первый :
template <> struct Length<NullType>
полная специализация, вторая:
template <class T, class U>
struct Length< Typelist<T, U> >
это частичная специализация.
С полной специализацией вы даете точный тип, на котором специализироваться. С частичной специализацией вы разрешаете все типы, которые придерживаются некоторых ограничений, в этом случае его способность создавать тип: Typelist<T, U>
также должны быть предоставлены два аргумента типа шаблона.
Для более подробной информации смотрите здесь:
http://en.cppreference.com/w/cpp/language/template_specialization
http://en.cppreference.com/w/cpp/language/partial_specialization
Мой вопрос заключается в том, что шаблон основной длины имеет только 1 параметр (TList), но специализация имеет 2 параметра. Как это возможно,
То, что допускает частичная специализация, список параметров шаблона должен отличаться (подробности см. выше), но они должны предоставлять столько же аргументов типа, сколько ожидает основной шаблон (Length< Typelist<T, U> >
).
Следующая специализация является специализацией Length
для каждого типа Typelist<T, U>
, Пара шаблонных аргументов описывает TypeList<T, U>
что, очевидно, требует двух аргументов. Это не непосредственно определяет аргумент шаблона Length
,
template <class T, class U>
struct Length< Typelist<T, U> >
{
enum { value = 1 + Length<U>::value };
};
За template <class TList> struct Length;
специализация определяет, что TList = Typelist<T, U>
и это T
а также U
типы.