关于部分模板专业化的澄清

时间:2018-02-28 03:04:04

标签: c++ templates partial-specialization

此问题旨在澄清以下有关部分模板专业化的文档部分:

partial template specialization

我的问题属于部分初始化成员标题下的以下文字:

  

如果类模板是另一个类模板的成员,则它具有   部分专业化,这些专业化是成员   封闭类模板。如果实例化封闭模板,   实例化每个成员部分特化的声明   同样(所有其他的声明,但不是定义)   模板的成员被实例化)

     

如果主要成员模板明确(完全)专门用于a   给定(隐式)封闭类模板的特化,   为此,将忽略成员模板的部分特化   封闭类模板的特化。

     

如果明确表示成员模板的部分特化   专门用于封闭的给定(隐式)特化   类模板,主要成员模板和其他部分模板   专业化仍然考虑到这个专业化   封闭类模板。

上面演示的示例部分提到了以下内容:

template<class T> struct A { // enclosing class template
  template<class T2>
  struct B {}; // primary member template
  template<class T2>
  struct B<T2*> {}; // partial specialization of member template
};

template<>
template<class T2>
struct A<short>::B {}; // full specialization of primary member template
                       // (will ignore the partial)

A<char>::B<int*> abcip; // uses partial specialization T2=int
A<short>::B<int*> absip; // uses full specialization of the primary (ignores partial)
A<char>::B<int> abci; // uses primary

我不明白上述三种情况之间的区别,根据上面复制的文字,这种情况需要在每种情况下采取不同的处理方式。

任何人都可以提供简单的解释吗?

1 个答案:

答案 0 :(得分:0)

由于我不确定我的问题是否正确,所以请放纵。我假设你想知道你所呈现的实例中行为的差异和原因。

首先,您需要了解编译器如何选择要使用的模板特化。有一个很好的解释here,但它主要归结为:编译器总是选择模板最受限制/专门的模板专业化。

现在,让我们看看你在那里做的第一个实例:
A<char>::B<int*> abcip;
由于A<char>::B没有完全专业化,我们会查看A的一般定义,并为B<int*>找到两个匹配的模板专精。
B<T2> T2=int*B<T2*> T2=int。{。} 由于B<T2*>是受限制的,我们选择这一个。

现在让我们看看第二个实例:
A<short>::B<int*> absip;
引用文本的第2段现在适用,因为主要成员模板A<short>::B存在完全专业化。部分专业化A<T>::B<T2*>将不予考虑。这是有道理的,因为A<short>::B<T2>A<T>::B<T2*>更专业。如果我们要在您的代码中添加以下内容,情况会发生变化:

template<>
template<class T2>
struct A<short>::B<T2*> {};

由于这更加专业化,因此它将成为此实例化的选定模板。

最后一个实例化只是选择主要成员模板A<T>::B<T2>,因为这是唯一匹配的类型。