在头文件中
#pragma once
#include<iostream>
using namespace std;
template<typename T>
class MyArray
{
private:
T array[20]; //一个数组
int len;
public:
MyArray(); //构造函数
T showI(int i); //打印数组中的第i个数
void insertI(T I); //向数组中插入数
};
//构造函数初始化len
template<typename T>
inline MyArray<T>::MyArray()
{
len = 0;
}
//这里T主要是为了他是返回什么类型的就自适应为什么类型
template<typename T>
inline T MyArray<T>::showI(int i)
{
return array[i];
}
//这里T是为了不管是什么类型的都可以直接输入
template<typename T>
inline void MyArray<T>::insertI(T I)
{
array[len] = I;
len++;
}
//而模板类的特化如下
template<>
class MyArray<float> //为float类型创建特化
{
public:
MyArray(); //为了展示特化后的效果其实直接后面构造函数打印一句话就可以体现了
};
MyArray<float>::MyArray()
{
cout << "这是float类型的特化" << endl;
}
//接下来就是偏特化,其实就是需要特化的和不需要特化的写出来
template<typename T0,typename T1> //偏特化需要两个及以上的类型才行,原因后面解释
class pian
{
private:
T0 Null;
T1 Eins;
public:
pian();
};
template<typename T0,typename T1>
pian<T0,T1>::pian()
{
cout << "T0,T1" << endl;
}
//开始偏特化
template<typename T1> //这里写的是不需要偏特化的类型
class pian<int,T1> //这里就是把T0特化成为了int,而保留T1不变 **并且这个顺序很重要,在main函数中演示
{
public:
pian();
};
template<typename T1>
pian<int,T1>::pian()
{
cout << "int,T1" << endl;
}
在源文件中
#include<iostream>
#include"template class.h"
using namespace std;
int main()
{
MyArray<int> testarr0; //这里比如说我们用到是int类型的
int i = 0;
for (i = 0; i < 10; i++)
{
testarr0.insertI(i);
}
for (i = 0; i < 10; i++)
{
cout << testarr0.showI(i) << endl;
}
//试着调用一下特化
MyArray<float> testarr1; //这里就应该打印出来头文件里写的那句话;
//演示偏特化
pian<float, int> pian0; //对比前面的 class pian<int,T1> 可以看出,并没有对应int在前的顺序,所以调用T0.T1的构造函数
pian<int, float> pian1; //而这个中int对应上了顺序,所以是调用偏特化处理之后的构造函数
return 0;
}
|