hello~ 很高兴见到大家! 这次带来的是C++中关于模板进阶这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 个 人 主 页: 默|笙

模板参数分为类型模板参数和非类型模板参数。之前我们在模板初阶里学到的就是类型模板参数,现在我们来认识非类型模板参数。
//#define N 10
template<class T, size_t N>
class Stack
{
private:
T _a[N];//vector的内存是在堆上申请,它是动态的,如果我们需要一个静态栈的话
size_t top;
size_t capacity;
};
int main()
{
Stack<int, 10> st1;
Stack<int, 1000> st2;
return 0;
}
array<int, 10> a1;
int a2[10];a1.fill(1);//可以使用fill进行初始化模板的特化是在已有模板的基础之上另外进行改造,我们把这个基础模板叫做主模板,这个根据情况改造之后的模板就是特化模板。
template<>//表明这是一个特化版本
返回类型 主模板函数名<特化的类型>(主模板格式+特化类型 形参)
{
特化内容
}//主模板
template<class T>
void Less(const T& left, const T& right)
{
cout << "Less(const T& left, const T& right)" << endl;
}
//函数模板特化
//特化模板
template<>
void Less<double*>(double* const & left, double* const & right)
{
cout << "Less<double*>(double* const & left, double* const & right)" << endl;
}
int main()
{
Less(1, 2);
double n1 = 1.1, n2 = 2.2;
Less(&n1, &n2);
return 0;
}执行结果:

全特化就是把模板里的模板参数全部给特化掉,换成具体的类型。比如上面的函数模板特化就是这样。
例子:
//主类模板
template<class T1, class T2>
class Date
{
public:
Date()
{
cout << "Date<T1, T2>" << endl;
}
private:
T1 _d1;
T2 _d2;
};
//特化类模板
template<>
class Date<int, char>
{
public:
Date()
{
cout << "Date<int, char>" << endl;
}
private:
int _d1;
char _d2;
};
int main()
{
Date<int, int> d1;
Date<int, char> d2;
return 0;
}执行结果:

偏特化有两种,一种是模板参数只有一部分换成具体的类型,一种是不把它们换成具体类型,而是模式特化(比如添加修饰符*)。
//主类模板
template<class T1, class T2>
class Data
{
public:
Data()
{
cout << "Date<T1, T2>" << endl;
}
private:
T1 _d1;
T2 _d2;
};
//第一类部分参数特化
//特化第二个模板参数
template<class T1>
class Data<T1, char>
{
public:
Data()
{
cout << "Date<T1, char>" << endl;
}
private:
T1 _d1;
char _d2;
};
//特化第一个模板参数
template<class T2>
class Data<char, T2>
{
public:
Data()
{
cout << "Date<T2, char>" << endl;
}
private:
char _d1;
T2 _d2;
};template <未特化的模板参数列表>
class 类名<部分特化的参数模式> {
// 类实现
};//主类模板
template<class T1, class T2>
class Data
{
public:
Data()
{
cout << "Date<T1, T2>" << endl;
}
private:
T1 _d1;
T2 _d2;
};
//模式特化
template<class T1, class T2>
class Data<T1*, T2*>
{
public:
Data()
{
cout << "Data<T1*, T2*>" << endl;
}
private:
T1* _d1;
T2* _d2;
};template <typename 模板参数>
class 主模板名<修饰后的模板参数> { // 在尖括号中添加修饰符
// 类实现
};//主模板省略
//混合使用
template<class T1>
class Data<T1*, int>
{
public:
Data()
{
cout << "Data<T1*, int>" << endl;
}
private:
T1* _d1;
int _d2;
};



今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~ 让我们共同努力, 一起走下去!