специализация шаблона c ++ и количество аргументов шаблона

Я только начал изучать шаблоны, я просматривал пример, где реализован 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 параметра. Как это возможно, я читал в других местах, чтобы специализация имела меньшее количество параметров

0

Решение

первый :

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

-1

Другие решения

Следующая специализация является специализацией 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 типы.

0

По вопросам рекламы [email protected]