C++泛编程(4)

类模板高级(1)

  • 1.类模板具体化
    • 部分具体化
    • 完全具体化
  • 2.类模板与继承

1.类模板具体化

有了函数模板具体化的基础,学习类模板的具体化很简单。类模板具体化有两种方式,分别为部分具体化和完全具体化。假如有类模板:

template<class T1,class T2>
class AA 
{
    public:
        T1 m_a;
        T2 m_b;
        AA(T1 a,T2 b):m_a(a),m_b(b)
        {
            cout<<"类模板构造函数"<<endl;
        }
        void show();
};
template<class T1,class T2>
void AA<T1,T2>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这里把方法写在类外是为了更好地区分语法上的差别。这个模板的部分具体化和完全具体化有什么差别呢?

部分具体化

部分具体化是类模板特有的,它是指模板类的部分通用类型具有指定的数据类型,示例如下:

template<class T1>
class AA<T1,string>
{
    public:
        T1 m_a;
        string m_b;
        AA(T1 a,string b="ZhangSan"):m_a(a),m_b(b)
        {
            cout<<"类模板部分具体化构造函数"<<endl;
        }
        void show();
};
template<class T1>
void AA<T1,string>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这就是AA模板类的一个不完全具体化版本了。这个AA模板缺省了一个通用类型参数,在类外对方法进行定义时需要指出AA的两个模板参数,具体参数也不可以省略,其余不变。

完全具体化

完全具体化就是类模板完全没有通用参数,它才像是函数模板具体化,举例如下:

template<>
class AA<char,string>
{
    public:
        char m_a;
        string m_b;
        AA(char a='m',string b="ZhangSan"):m_a(a),m_b(b)
        {
            cout<<"类模板部分具体化构造函数"<<endl;
        }
        void show();
};
void AA<char,string>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这里有一个细节需要大家注意,我们在类外定义方法时不再需要写template标识符,但依然需要注明AA的两个具体的模板参数。
下面我们来调用一下模板类,看看调用的优先级:

int main()
{
    AA<int,int> aa(10,20);
    aa.show();
    AA<int,string> bb(10);
    bb.show();
    AA<char,string> cc('w',"LiSi");
    cc.show();
}

C++泛编程(4)_第1张图片
可以看到,如果满足完全具体化类的条件,会优先使用完全具体化类,如不满足,满足不完全具体化类条件优先使用不完全具体化类。只有当二者都不满足时才会使用普通的模板类。

2.类模板与继承

你可能感兴趣的:(c++,c++,开发语言)