杭州网站建设商城价格,php+mysql网站开发全程实例.pdf,o2o指的是什么,黄河道网站建设目录
1. 非类型模板参数
2.模板的特化
2.1 函数模板的特化 2.2 类模板的特化
2.2.1 全特化 2.2.2 偏特化
3.模板的分离编译
3.1 什么是分离编译#xff1f;
3.2 模板的分离编译
4.模板的总结 模板的初阶内容#xff1a;(594条消息) C模板的原理和使用_全貌的博客-CSD…目录
1. 非类型模板参数
2.模板的特化
2.1 函数模板的特化 2.2 类模板的特化
2.2.1 全特化 2.2.2 偏特化
3.模板的分离编译
3.1 什么是分离编译
3.2 模板的分离编译
4.模板的总结 模板的初阶内容(594条消息) C模板的原理和使用_全貌的博客-CSDN博客_c模板实现原理https://blog.csdn.net/qq_64105689/article/details/126693075?spm1001.2014.3001.5501
1. 非类型模板参数
模板的参数分为 类类型形参和非类型形参
类类型形参出现在模板参数列表中由class 和 typename关键字修饰
非类型形参用一个常量来做类(函数)模板的参数在类(函数)中可将该参数当作常量使用
namespace test
{//实现一个包含非类型模板参数的静态数组templateclass T, size_t N 10//在类中可以将N当作常量使用class array{public:T operator[](size_t i){return _arr[i];}const T operator[](size_t i){return _arr[i];}bool empty(){//...}private:K _arr[N];size_t size;};
} 字符串、浮点数、类对象是不允许作为非类型模板参数 非类型模板参数必须在编译时就确定结果 2.模板的特化
使用模板可以编写一些与类型无关的代码但在面对特殊类型结果就会错误
比如实现了一个比较函数Less,大部分情况下比较的结果都是正确的但是对指针类型比较的是指针存放地址的大小结果显然易见是错误的这时候模板的特化很好的解决了这样的问题
templateclass T
bool Less(const T a, const T b)
{return a b;
}
int main()
{int a1 7;int a2 6;cout Less(a1, a2) endl;//比较的是a1和a2的值//结果正确int* ptr1 a1;int* ptr2 a2;cout Less(ptr1, ptr2) endl;//比较的是a1和a2的地址//应返回false,打印0结果错误return 0;
}
2.1 函数模板的特化 1.必须先有一个函数模板 templateclass T//要特化的函数模板
void Func(T left, T right)
{
}; 2.template后面跟空的 template//跟一对空的
void Funcint*(int* val1,int* val2)
{} 3.函数名后跟一对尖括号括号内是要特化的类型 template//跟一对空的
void Funcint*(int* val1,int* val2)//函数名Func后跟要特化的类型
{} 4.形参列表必须跟模板参数完全相同不然就会出现一些奇怪的错误 template//跟一对空的
void Funcint*(int* val1,int* val2)//函数名Func后跟要特化的类型
{//新参列表的类型要与特化的类型int*一致
} 当然函数模板是不建议使用特化的因为遇到一些复杂的类型函数模板不好处理时可以直接显示写出该函数。 bool Func(int* left,int* right)
{return *left *right;
} 2.2 类模板的特化
2.2.1 全特化
顾名思义就是将函数模板参数全部确定化
templateclass T1, class T2
class Func
{
public: Func(){cout Func() T1,T2 endl;}
private:T1 _a1;T2 _a2;
};template
class Funcchar, int
{
public: Func(){cout Func char, int endl;}
private:char _a1;int _a2;
};int main()
{Funcint,int f1;Funcchar,int f2;return 0;
} 2.2.2 偏特化
针对任意模板参数进行特殊处理
偏特化分为两种 1.部分特化 就是特化模板参数的部分其他跟全特化一致 2.对参数更进一步的限制 比如模板参数为T1,T2,那么可以特化为T1*, T2*、T1,T2的版本 templateclass T1, class T2
class Func
{
public: Func(){cout Func() T1,T2 endl;}
private:T1 _a1;T2 _a2;
};
template
class FuncT1*, T2*
{
public: Func(){cout Func() T1*,T2* endl;}
private:T1* _a1;T2* _a2;
};
template
class FuncT1, T2
{
public: Func(){cout Func() T1,T2 endl;}
private:T1 _a1;T2 _a2;
};3.模板的分离编译
3.1 什么是分离编译
一个程序项目 由若干个源文件共同实现通过编译形成目标文件最后将目标文件链接形成单一的可执行文件执行的过程就叫做分离编译。
3.2 模板的分离编译
举个例子
//a.h
templateclass T
T Add(const T letf, const T right);//a.cpp
templateclass T
T Add(const T letf, const T right);
{return left right;
}//test.cpp
#includea.h
int main()
{Add(1,2);
} C/C程序要运行要经过 预处理 - 编译 - 汇编 - 链接 编译对程序按照语言特性进行词法、语法、语义分析错误检查无误后生成汇编代码 头文件不参加编译编译器对程序内多个源文件是单独分开独立编译的。 链接将多个.obj文件链接到一起并处理没有解决的地址问题 解决方法将.h跟.cpp文件放入一个文件xxx.hpp或xxx.h里面 4.模板的总结 优点: 1.模板复用了代码增加了开发效率C的模板库(STL)也因此而诞生 2.增强了代码的灵活性 缺点 1.模板会导致代码膨胀的问题编译时间变长 2.模板编译错误时错误信息非常凌乱不易定位错误