类模板高级(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();
}
可以看到,如果满足完全具体化类的条件,会优先使用完全具体化类,如不满足,满足不完全具体化类条件优先使用不完全具体化类。只有当二者都不满足时才会使用普通的模板类。