
【C++】函数模板及类模板详解
模板编译:生成优化后的模板结构。 代码生成:根据输入类型生成实际代码。 提高代码的灵活性和可重用性。 减少代码冗余,提升开发效率。 导致代码体量增加,影响效率。 调试模板错误时较为困难。
发布日期:2021-05-10 06:33:26
浏览次数:20
分类:精选文章
本文共 1548 字,大约阅读时间需要 5 分钟。
模板与泛型编程
编写一套与特定类型无关的通用代码,是软件开发中的代码复用常用手段。
1. 函数模板
函数模板也是一个与特定类型无关的功能,不需要显式指示就能根据输入的类型生成专门版本的函数。
1.1 函数模板的格式
templatevoid Swap(T& left, T& right) { int temp = left; left = right; right = temp;}
这样,对于任意类型,Swap函数都能正确工作。
1.2模板的原理
编译器通过对传入类型的推断,分别为不同的类型生成特定代码。例如,传入double,编译器生成处理double的Swap函数。
1.3 这些函数的实例化方式
- 隐式实例化:无需显式指明模板参数,默认根据传递参数推导类型。
int main() { Swap(1, 2); // Integer类型的Swap函数自动调用 Swap(1.0, 2.0); // Double类型的Swap函数自动调用 Swap('1', '2'); // Char类型的Swap函数自动调用}
- 显式实例化:在调用函数时明确指明模板参数。
int main() { Swap (1, 2.0); // 手动指定int类型作为模板参数}
2. 类模板
类模板结合模板参数进行类型推断,灵活支持多种数据类型。
2.1 类模板的定义格式
templateclass Test {public: Test() {}; ~Test(); private: T* pData;};
通过模板参数T,支持任意类型的数据存储。
2.2 类模板的实例化
Test s1;Tests2;
这样,Test类分别支持int和double类型的对象。
3. 模板参数
模板参数分为类型模板参数和非类型模板参数。
3.1 类型模板参数
templateclass Test {};
- T: 类型模板参数。
- N: 非类型模板参数,格式为size_t(整型)。
3.2 使用注意事项
- 非类型的模板参数必须在编译期确定。
- 常用非类型模板参数只能是整型,避免浮点数、类或字符串等。
4. 模板特化
针对特殊类型,提供特定版本以提高效率或功能。
4.1 函数模板特化
// 通用模板templatebool IsEqual(T left, T right) { return (left == right);}// 特化模板(针对char*)template <>bool IsEqual ( char*& left, char*& right ) { return strcmp(left, right) == 0; }
4.2 类模板特化
- 全特化:将模板参数全部替换。
- 偏特化:限制部分参数类型为特定形式,如指针或引用。
4.3 内置类型和自定义类型的拷贝
特化内置类型(如int)和自定义类型(如特化的类)确保拷贝正确。
5. 分离编译的原理
模板的编译分为两步:
分离编译允许单个源文件实现模板,但因为生成的代码存在依赖关系,需确保编译器能正确处理。
6. 模板的优缺点
优点:
缺点:
发表评论
最新留言
不错!
[***.144.177.141]2025年04月30日 23时23分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ElasticSearch - 基于 JavaRestClient 操作索引库和文档
2023-01-24
ElasticSearch - 基础概念,以及和 mysql 的对比
2023-01-24
ElasticSearch - 索引库和文档相关命令操作
2023-01-24
elasticsearch 7.7.0 单节点配置x-pack
2023-01-24
ElasticSearch 中 REST API 详解
2023-01-24
Hot100之回溯算法
2023-01-24
Elasticsearch 时区问题
2023-01-24
Elasticsearch 索引字段类型为text,添加keyword类型操作
2023-01-24
Elasticsearch(四) es出现的问题:填坑
2023-01-24
elasticsearch-5.1.1 安装的问题
2023-01-24
Elasticsearch7.3.1启动指定JDK11
2023-01-24
Elasticsearch下载安装
2023-01-24
Elasticsearch入门教程(Elasticsearch7,linux)
2023-01-24