我刚开始学习模板,我正在通过一个实现TypeList的示例,并看到了TypeList的Length方法的实现。
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 :(得分:0)
以下专业化是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
是类型。
答案 1 :(得分:-1)
第一个:
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> >
)。