模板专门化部分、全部等和继承

Templates specialization partial, full etc and inheritance

本文关键字:继承 全部 专门化部      更新时间:2023-10-16

谁能让我知道类模板完全特化,部分特化之间的区别是什么?模板类的继承规则是什么,即专门化类可以从泛型类派生出来吗?代码真的很有用。谢谢。

问题谁能让我知道什么是类模板完全特化,部分特化之间的区别?

Answer完全专门化表示已显式指定了所有模板参数。部分专门化意味着明确指定了一个或多个模板参数,但不是所有参数。

类模板示例:

template <typename T1, typename T2> struct A
{
   A() { std::cout << "Came to A<T1, T2>::A()n"; } 
};

部分专门化示例。

template <typename T1> struct A<T1, int>
{
   A() { std::cout << "Came to A<T1, int>::A()n"; } 
};

完全专门化示例。

template <> struct A<int, int>
{
   A() { std::cout << "Came to A<int, int>::A()n"; } 
};
int main()
{
   A<char, float> a1;
   A<double, int> a2;
   A<int, int> a3;
}

当您运行程序时,您应该得到以下输出:

Came to A<T1, T2>::A()
Came to A<T1, int>::A()
Came to A<int, int>::A()

问题模板类的继承规则是什么,即专门化类是否可以从泛型类派生等?

答案类模板的继承规则,无论是否特化,与普通类的继承规则相同。

在上面的例子中,您可以从任何您想要的类中导出A<T1, T2>, A<T1, int>A<int, int>。反过来,它们也可以是任何类的基类。

由于没有涉及类模板的类继承的具体规则,任何示例都是多余的。但是,如果有帮助,您可以执行以下操作:

struct B
{
};
template <typename T1> struct A<T1, int> : public B
{
   A() { std::cout << "Came to A<T1, int>::A()n"; } 
};

你也可以这样做:

template <typename T1> struct C : public A<T1, int>
{
   C() { std::cout << "Came to C<T1>::C()n"; } 
};
template <typename T1> struct D : public A<T1, T1*>
{
   D() { std::cout << "Came to D<T1>::D()n"; } 
};