c ++模板专业化和模板参数的数量

Posted

技术标签:

【中文标题】c ++模板专业化和模板参数的数量【英文标题】:c++ template specialization and number of template arguments 【发布时间】:2017-09-10 19:45:58 【问题描述】:

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

【问题讨论】:

specialization 有 2 个参数,但只定义一种类型。 特化本身是一个带有两个参数的模板,但它仍然只为特化提供一种类型 (Typelist&lt;T, U&gt;)。 【参考方案1】:

下面的特化是Length 对每个类型Typelist&lt;T, U&gt; 的特化。这对模板参数描述了TypeList&lt;T, U&gt;,它显然需要两个参数。它没有直接定义Length的模板参数。

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

    enum  value = 1 + Length<U>::value ;
;

对于template &lt;class TList&gt; struct Length;,特化定义TList = Typelist&lt;T, U&gt;TU 是类型。

【讨论】:

【参考方案2】:

第一个:

template <> struct Length<NullType>

是全专业化,第二个:

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

是部分特化。

通过完全专业化,您可以指定要专门化的确切类型。通过部分特化,您允许所有符合某些限制的类型,在这种情况下,它能够创建类型:Typelist&lt;T, U&gt;,还必须提供两个模板类型参数。

更多详情请看这里:

http://en.cppreference.com/w/cpp/language/template_specialization http://en.cppreference.com/w/cpp/language/partial_specialization

我的问题是主长度模板只有 1 个参数(TList),但专业化有 2 个参数。这怎么可能,

这就是部分特化所允许的,模板参数列表必须不同(有关详细信息,请参见上面的链接),但它们必须提供与主模板期望的相同数量的类型参数 (Length&lt; Typelist&lt;T, U&gt; &gt;)。

【讨论】:

以上是关于c ++模板专业化和模板参数的数量的主要内容,如果未能解决你的问题,请参考以下文章

[C++11 模板的改进] --- 可变参数模板

C++11 ——— 可变参数模板

C++11 ——— 可变参数模板

[C++11 模板的改进] --- 可变参数模板

如何使用可变参数模板参数保存可变数量的参数?

功能模板专业化的重要性和必要性