【C++】11.模板进阶
创始人
2025-05-28 23:29:29
0

1.非类型模板参数

模板参数分类类型形参与非类型形参。

  • 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
  • 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
//非类型参数+非类型模板参数
template
//float double string不能做非类型模板参数
//int short char long  long long可以 整形
class Array
{
public://Array()//{//	N = 10;//无法修改 N是常量 修改会报错//}
private:T _a[N];
};
int main()
{Array a1; //100Array a2; //1000return 0;
}

2.模板的特化

1°概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得

到一些错误的结果。此时,就需要对模板进行特化。即:在原模板类的基础上,针对特殊

类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化。

//模板的特化
template
bool IsEqual(T& left, T& right)
{return left == right;
}//特化 (针对某些类型的特殊化处理) 加在函数名后面
template<>
bool IsEqual(char*& left, char*& right)
{return strcmp(left, right) == 0;
}
  • 有可能是字符串的比较 此时需要进行特殊的处理
  • template<>+函数名后<类型名>

2°分类

1*全特化

//接下来对这个类进行特化
template
class Data
{
public:Data() { cout << "Data" << endl; }
private:T1 _d1;T2 _d2;
};//特化 加在类名后面
//全特化 全部的参数都特化
template<>
class Data
{
public:Data() { cout << "全特化:Data" << endl; }
private:
};

2*偏特化

//偏特化/半特化
//第一种
template
class Data
{
public:Data() { cout << "偏特化:Data" << endl; }
private:
};
//第二种
template
class Data
{
public:Data() { cout << "偏特化:Data" << endl; }
private:
};
//第三种
template
class Data
{
public:Data() { cout << "偏特化:Data" << endl; }
private:
};

3*测试

int main()
{int a = 0, b = 1;cout << IsEqual(a, b) << endl;const char* p1 = "hello";const char* p2 = "world";cout << IsEqual(p1, p2) << endl;Data d1;//偏特化Data d2;//调全特化版本Data d3;//调偏特化版本Data d4;//普通版本//第一个是int就调半特化 如果第二个是char那就是全特化//第一个不是int 就调普通版本Data d5;Data d6;Data d7;//可调指针 引用return 0;
}

3.模板分离编译

  • 预处理过程分为几步?具体是干什么的?

Func.h Func.cpp Test.cpp

1.预处理 展开头文件/宏替换/条件编译/去掉注释

Func.i Test.i

2.编译 检查语法 生成汇编代码

Func.s Test.s

3.汇编 将汇编代码转成二进制的机器码

Func.o Test.o

4.链接 将目标文件合到一起 编译时F1和F2函数由声明 所以编译过来 链接时要去Func.o中找F1和F2的地址

a.out 这里F1找到了 F2没找到 所以报了一个链接错误

分离编译

项目工程中一般将函数或者类的声明放到.h

将函数或者类的定义放到.cpp

为什么要分离编译呢? 方便查看和维护

  • 同样式分离编译 普通函数/类可以 函数模板/类模板为什么不行?

最后链接错误 普通函数和类可以找到地址 而模板函数/类模板找不到

  • 解决方法:

    1.将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。

    2.模板定义的位置显式实例化。

最好使用1 都放到.h中就可以了

#include "Func.h"int main()
{F1();        //可以调到 call 一个函数地址F2(10);      //模板的话 出了问题 链接错误//函数模板找不到相关地址 符号表里面没有F2()//显示实例化后可以找到F2(10.11);//突然来个double 又找不到了 用一个就要实例化一个F2('a');return 0;
}
#pragma once
#include 
using namespace std;void F1();template
void F2(const T& x)
{cout << "void F2(const T& x)" << endl;
}
#include "Func.h"void F1()
{cout << "F1()" << endl;
}//template
//void F2(const T& x)
//{
//	cout << "void F2(const T& x)" << endl;
//}解决模板不能分离
1.显示实例化 不常用 因为不方便
2.粗暴 就是不要分离编译了
//template
//void F2(const int& x);
//
//template
//void F2(const double& x);
//直接放到.h里
//所以模板放.h
//函数都可以

4.总结

优点:

  1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
  2. 增强了代码的灵活性

缺点:

  1. 模板会导致代码膨胀问题,也会导致编译时间变长
  2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关内容

热门资讯

卡门涡街 卡门涡街在自然界中常常可以看到卡门涡街现象,例如水流过桥墩,定常风吹过烟囱、电线等都会形成卡门涡街....
从《和解》来解读志贺直哉父子... 从《和解》来解读志贺直哉父子关系转变的过程摘 要:《和解》是大正六年(1917年)十月发表在《黑潮》...
幼儿园中班秋游活动方案2篇 幼儿园中班秋游活动方案如何制定?以下是PINCAI小编收集的幼儿园中班秋游活动方案,仅供大家阅读参考...
固定资产处置业务中的涉税处理... 固定资产处置业务中的涉税处理论文  固定资产处置是指企业的固定资产退出现有正常工作状态。固定资产退出...
地理论文参考 地理论文参考范文  导语:地理学是研究地球表面的地理环境中各种自然现象和人文现象,以及它们之间相互关...
参考文献字体格式要求   参考文献是在学术研究过程中,对某一著作或论文的整体的参考或借鉴。下面,小编为大家分享参考文献字体...
圣诞派对活动方案 圣诞派对活动方案(精选15篇)  为了确保活动有序有力开展,常常需要提前制定一份优秀的活动方案,活动...
如何做好可控震源的质量监控 如何做好可控震源的质量监控在可控震源施工中,必须对每一振次进行实时监控,对震源技术指标进行全程监控,...
图书馆世界读书日活动方案 图书馆2021年世界读书日活动方案(精选5篇)  为了确保活动有序有力开展,常常需要预先准备活动方案...
五四青年晚会活动方案 五四青年晚会活动方案(精选14篇)  为了确保活动有效开展,我们需要事先制定活动方案,活动方案指的是...
运动会开幕式入场方案 运动会开幕式入场方案  什么是工作方案?  工作方案是对未来要做的重要工作做了最佳安排,并具有较强的...
三八女神节活动策划方案 三八女神节活动策划方案(精选14篇)  为了确保活动能无误进行,通常需要预先制定一份完整的活动方案,...
饭店酒水促销活动方案 饭店酒水促销活动方案  为了确保活动能有条不紊地开展,预先制定活动方案是必不可少的,活动方案是活动的...
新年跨年活动方案   一、活动介绍  (一)活动流程介绍  (二)晚会特色  1.晚会幕布:  2.晚会入场:  3....
开放日活动方案 开放日活动方案(精选18篇)  为确保活动高质量高水平开展,预先制定活动方案是必不可少的,活动方案的...
教师读书活动方案 教师读书活动方案(通用17篇)  为确保事情或工作顺利开展,就常常需要事先准备方案,方案指的是为某一...
酒店圣诞节活动方案 酒店圣诞节活动方案7篇  为了确保工作或事情能有条不紊地开展,通常需要提前准备好一份方案,方案是为某...
五一劳动主题活动方案 五一劳动主题活动方案(精选19篇)  为了确保工作或事情能有条不紊地开展,我们需要事先制定方案,方案...
送教下乡活动方案 送教下乡活动方案  为了确保事情或工作能无误进行,常常需要提前准备一份具体、详细、针对性强的方案,方...
新时代文明实践活动实施方案 新时代文明实践活动实施方案(精选7篇)  为了确保活动顺利进行,常常需要提前进行细致的活动方案准备工...