长春网站建设哪个公司好,公司支付网站款做凭证,chrome google,游戏分销代理平台目录
模板的形式#xff1a;
一.模板的多参数应用#xff1a;
例#xff1a;
错误使用1#xff1a;使用不标准的模板形参表
编辑
错误使用2#xff1a;使用变量作为实参传递给函数模板
二.模板的特例化#xff1a;
类模板#xff1a;
针对模板的特化步骤
一.模板的多参数应用
例
错误使用1使用不标准的模板形参表
编辑
错误使用2使用变量作为实参传递给函数模板
二.模板的特例化
类模板
针对模板的特化步骤
类模板的全特化
类模板的半特化:
半特化的扩展
三. 模板总结 在之前我介绍过一篇关于C模板的作用它的出现解决了C语言对多种不同类型的但是有着相同作用函数的难题举个例子想要作用于两个整型变量的交换那么使用C语言可以写出整型交换的函数但是又出现了char型、double型、short型变量的交换那么就需要再写出这三个类型的交换函数而这几个函数写出来后唯一的不同点就是返回值和形参的不同造成了代码的冗余可读性变差。 模板的形式 template 模板形参表 返回值类型 函数体模板函数形参表 { } 而模板的出现使得交换函数只需要写一个就够极大的缩减了代码增加了函数的复用性为泛型编程打下了坚实的基础
(478条消息) C基础——模板讲解_橙予清的zzz~的博客-CSDN博客https://blog.csdn.net/weixin_69283129/article/details/127845086
感兴趣的朋友门可以来看看这篇文章它会加深你对模板的理解。 而接下来我要讲的是模板的另外几个作用 一.模板的多参数应用 非类型模板参数 模板参数分类类型形参与非类型形参。 1.类型形参即出现在模板参数列表中跟在class或者typename之类的参数类型名称。 2.非类型形参就是用一个常量作为类(函数)模板的一个参数在类(函数)模板中可将该参数当成常量来使用。 在上面的那篇博客中我所列举的模板例子中用到的全都是类型形参。 // 定义一个模板类型的静态数组templateclass T, size_t N 10class array{public:T operator[](size_t index){return _array[index];}const T operator[](size_t index)const{return _array[index];}size_t size()const{return _size;}bool empty()const{return 0 _size;}private:T _array[N];size_t _size;} 通过上图代码可知模板形参列表中出现了非类型形参。该参数可以是变量但其类型只能是整型这个整型包括char、int、size_t等类型而使用自定义类型、浮点类型的变量是不被允许的会报编译错误 例 运行结果 错误使用1使用不标准的模板形参表 错误使用2使用变量作为实参传递给函数模板 二.模板的特例化 类模板 函数模板是对函数进行泛型的使用让函数能够对多种类型的变量做相应的操作 而类模板就算对类进行泛型的使用让类中的成员变量或者函数做相应的复杂操作。 //类模板样例1
templateclass T1,class T2
class Date {
public:Date() {cout 模板Date(T1,T2) endl;}
private:T1 _a1;T2 _b1;}; 针对模板的特化步骤 1. 必须要先有一个基础的函数模板或者类模板 2. 关键字template后面接一对空的尖括号 3. 函数名后跟一对尖括号尖括号中指定需要特化的类型 4. 函数形参表: 必须要和模板函数的基础参数类型完全相同如果不同编译器可能会报一些奇怪的错误。 类模板的全特化 全特化即是将模板参数列表中所有的参数都确定化。
//类模板的特殊化处理——全部参数特殊化处理
template
class Datedouble,double{
public:Date() {cout 全特化Date(double, double) endl;}
private:double _a1;double _b1;
};//类模板的特殊化处理——全部参数特殊化处理2
template
class Dateshort,char {
public:Date() {cout 全特化Date(short, char) endl;}
private:short _a1;char _b1;
};如上全特化的类模板所使用的模板形参列表相比较普通的类模板类型是全部确定的。全特化的作用就是在一般的情况下普通的对象被创建时使用普通类模板即可做着普通的工作。而在某种特殊情况下我们可以让对象被创建时使用专门的经过特殊化处理的类模板做一些特殊的操作。 类模板的半特化: 针对模版参数进一步进行条件限制设计的特化即部分特化模板参数列表。
//半参数特殊化处理——案例1
templateclass T2
class Datedouble, T2 {
public:Date() {cout 半特化Date(double, T2) endl;}
private:double _a1;T2 _b1;
};//半参数特殊化处理——案例2
templateclass T1
class DateT1, char {
public:Date() {cout 半特化Date(T1, char) endl;}
private:T1 _a1;char _b1;
};类模板原本是T1,T2两个类型的参数使用半特化就是将T1具体化成double类型作为模板参数。 int main(){Dateint, int d1;Datedouble, doubled2; Dateshort,chard3; Datedouble, int d4; Dateint, char d5; return 0;}
接着我们在main函数中使用类创建几个对象看编译器会进入哪些类模板中
运行结果: 代码解析: 通过结果可知d1的创建是调用了类模板T1,T2的构造函数d2,d3是调用了全特化的类模板构造函数d4,d5调用了半特化的类模板构造函数。 将这些比作生活的例子当时间到了吃中午饭的时候编译器饿了在它面前有三种吃法1.自己拿食材做(炒,炸,烧,爆,煎,煮)2.做省时省力的半成品饭3.点外卖。而T1,T2类型的类模板好比是从超市买回来的新鲜食材需要编译器自己去做才能吃半特化的类模板好比是半成品例如方便面、自热饭、昨晚的剩饭剩菜需要编译器进行小小的加工就可以吃了而全特化的类模板好比是外卖是现成的热乎的香喷喷的饭菜。在不考虑金钱和健不健康的情况下我们的做法肯定是选择好吃美味而且省时省力的外卖编译器的思想也和我们一样——有现成的就不会自己动手再去做。 所以编译器在对d1对象的调用时发现没有完美符合int,int的类模板那么只能去自己做(使用T1,T2模板的构造函数) 而对于d2对象的调用发现double,double的构造函数选项有两种一种是选择T1,T2的类另一种是选择double,double的类那编译器肯定是选择后者。 ...... 半特化的扩展 半特化还可以应用于指针、引用的类型上
templateclass T1,class T2
class DateT1*,T2* {
public:Date() {cout 半特化Date(T1*,T2*) endl;}
private:T1* _a1;T2* _b1;
};//半特化4——两个参数偏特化为引用类型
templateclass T1, class T2
class DateT1, T2 {
public:Date(const T1 d1, const T2 d2): _d1(d1), _d2(d2){cout 半特化DataT1, T2 endl;}private:const T1 _d1;const T2 _d2;
}; 三. 模板总结 优点
1. 模板复用了代码节省资源更快的迭代开发C的标准模板库(STL)因此而产生 2. 增强了代码的灵活性