网站备案号 放网站,wordpress模版使用,成都建设路小学网站,深圳市中心在哪里最繁华目录
1.类型模板参数和非类型模板参数
2.特化
3. 模板的分离编译
4.模板的优缺点 1.类型模板参数和非类型模板参数
之前写模板传的都是类型——类型模板参数
现在想定义两个静态数组#xff0c;数组长度不同#xff0c;就可以用模板参数传数值而不是传类型
非类型模板…目录
1.类型模板参数和非类型模板参数
2.特化
3. 模板的分离编译
4.模板的优缺点 1.类型模板参数和非类型模板参数
之前写模板传的都是类型——类型模板参数
现在想定义两个静态数组数组长度不同就可以用模板参数传数值而不是传类型
非类型模板参数——是一个常量只适用于整型intshortcharsize_t... 那么这个静态数组可以用array是一个固定大小的顺序表 其实可以发现他的模板参数就是有类型的也有非类型的 成员函数没有头尾插有迭代器和范围for他对比的是C的静态数组并且他的数据也存在栈上 为什么可以兼容C还要搞出他
他们对越界的检查不一样
C对越界读不检查越界写抽查
C的array越界读写都能查因为重载了[ ],operator对其检查 2.特化
模板的特化使用模板可以实现一些与类型无关的代码但对于一些特殊的类型可能会得到错误结果
按照类型分类
函数模板特化
比如之前我们实现的Less如果传的是类型指针就会比较地址而不是解引用之后的值 我们的解决方案是自己写一个仿函数
但是有一点点挫
现在我们可以进行特化
templateclass T
bool Less( T left, T right)
{return left right;
}template
bool LessDate*(Date* left, Date* right)
{
return *left *right;
}一定要注意函数模板特化一定要有函数模板然后才是针对某些类型的特殊处理用函数模板特化 只有特化是会报错的因为一般类型没有处理 注意参数列表的统一说的通俗一些特化就是特殊处理但是本质不应该改变
第一个Less是对引用的比较但是第二个Less突然变成了对“值”的比较 应该写成 当然对于函数模板特化这个类型匹配非常恶心建议还是直接写成重载 类模板特化
和刚才的规则一样
假设我们对A类的int,int 类型特化
templateclass T1, class T2
class A
{
public:A(){cout AT1, T2 endl;}
private:T1 _a1;T2 _a2;
};template
class Aint, int
{
public:A(){cout Aint, int endl;}
private:int _a1;int _a2;
};
调用结果 按照特化程度分类
全特化全部参数特化
还是上面那个例子只对int,int类型特化int,X不可以X,int也不可以 偏特化 /半特化部分参数特化是对参数类型的进一步限制
只要类型是X,char就匹配
templateclass T1, class T2
class A
{
public:A(){cout AT1, T2 endl;}
private:T1 _a1;T2 _a2;
};
templateclass T
class AT, char
{
public:A(){cout Aint, int endl;}
private:T _a1;char _a2;
}; 优先级总结 a1可以三种都可以匹配但是他选择全特化
a2可以匹配半特化和类模板他选择前者
最后一个没有选择 特化本质编译器的参数匹配原则 3. 模板的分离编译
定义一个程序项目由若干个源文件共同实现而每个源文件单独编译生成目标文件最后将所有的目标文件链接在一起形成单一的可执行文件的过程 无法解析的外部符号就是链接错误因为在编译的时候会生成符号表把语言级别的代码变成汇编语言然后汇编形成可重定位的目标二进制文件.obj最后链接自己形成的几个.obj然后生成可执行程序
在函数定义中无法确定T的类型故没有实例化
在函数模板调用中没有函数实现还是没办法实例化
因此最后这个函数模板没有实例化无法生成符号链接时自然找不到 解决方法声明和定义都写在.h/.hpp中 4.模板的优缺点
优点模板复用了代码节约资源更快迭代开发增强代码灵活性缺点导致代码膨胀编译时间变长出现模板编译错误时报错信息混乱不易定位错误