1

我刚刚开始学习模板,我正在浏览一个实现 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 个参数。这怎么可能,我在其他地方读到,专业化的参数数量较少

4

2 回答 2

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;专业化定义了 thatTList = Typelist<T, U>和 thatT并且U是类型。

于 2017-04-14T14:32:21.130 回答
-1

首先 :

template <> struct Length<NullType>

是全专业化,第二个:

template <class T, class U>
struct Length< Typelist<T, U> >

是部分专业化。

通过完全专业化,您可以指定要专门化的确切类型。通过部分特化,您允许所有遵守某些限制的类型,在这种情况下,它能够创建 type : 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> >)。

于 2017-04-14T14:35:01.487 回答