C++ 类模版
有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:
单个类模板语法
#include "iostream"
using namespace std;
template<typename T>
class A
{
public:
A(T t)
{
this->t = t;
}
T &getT()
{
return t;
}
protected:
public:
T t;
};
void main()
{
A<int> a(100);
// a.getT();
cout << a.t << endl;
system("pause");
return ;
}
继承中的类模板语法
类模板参数的缺省值:
类模板参数的缺省值就是在声明或定义模板的时候在模板参数后面等于一个类型
形如下面的代码:
struct NullType { }; template <typename T1, typename T2 = NullType> class Test { public: Test(T1 a1, T2 b1):a(a1), b(b1){ cout << "Template class" << endl; } private: T1 a; T2 b; };
作用:
1. 可以在模板偏特化时指定一个模板参数,后面的模板参数采用默认值类型,如下:
template <typename T1> class Test<T1> { public: Test(T1 a1):a(a1){ cout << "Template class number specialization(Type1)" << endl; } private: T1 a; };
类模板全特化(特化):
类模板全特化是类模板类型为空,在类名的尖括号里面指定好类型,如下:
template <> class Test<int, char> { public: Test(int a1, char b1):a(a1), b(b1){ cout << "Template class full specialization" << endl; } private: int a; char b; };
类模板部分特化(偏特化):
类模板偏特化是类名后面的尖括号中的类型一部分是指定好的,一部分需要模板参数传入,如:
template <typename T2> class Test<char, T2> { public: Test(char a1, T2 b1):a(a1), b(b1){ cout << "Template class number specialization(Type2)" << endl; } private: char a; T2 b; };
以上是模板参数数量的偏特化,还有其他类型的偏特化,如下:
指针类型的偏特化:
template <typename T1, typename T2> class Test<T1*, T2*> { public: Test(T1* pa1, T2* pb1):pa(pa1), pb(pb1){ cout << "Template class pointer specialization" << endl; } private: T1* pa; T2* pb; };
常量类型的偏特化:
template <typename T1, typename T2> class Test<T1 const, T2 const> { public: Test(T1 a1, T2 b1):a(a1), b(b1){ cout << "Template class const specialization" << endl; } private: T1 a; T2 b; };
使用偏特化的前提:
1. 无论是哪种特化,泛化版(模板类名后面无尖括号)要定义在每种特化版本之前