【C++】函数模板及类模板详解
发布日期:2021-05-10 06:33:26 浏览次数:20 分类:精选文章

本文共 1548 字,大约阅读时间需要 5 分钟。

模板与泛型编程

编写一套与特定类型无关的通用代码,是软件开发中的代码复用常用手段。

1. 函数模板

函数模板也是一个与特定类型无关的功能,不需要显式指示就能根据输入的类型生成专门版本的函数。

1.1 函数模板的格式

template 
void 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 类模板的定义格式

template 
class Test {
public:
Test() {};
~Test();
private:
T* pData;
};

通过模板参数T,支持任意类型的数据存储。

2.2 类模板的实例化

Test
s1;
Test
s2;

这样,Test类分别支持int和double类型的对象。

3. 模板参数

模板参数分为类型模板参数和非类型模板参数。

3.1 类型模板参数

template 
class Test {
};
  • T: 类型模板参数。
  • N: 非类型模板参数,格式为size_t(整型)。

3.2 使用注意事项

  • 非类型的模板参数必须在编译期确定。
  • 常用非类型模板参数只能是整型,避免浮点数、类或字符串等。

4. 模板特化

针对特殊类型,提供特定版本以提高效率或功能。

4.1 函数模板特化

// 通用模板
template
bool 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. 模板的优缺点

    优点:

  • 提高代码的灵活性和可重用性。
  • 减少代码冗余,提升开发效率。
  • 缺点:

  • 导致代码体量增加,影响效率。
  • 调试模板错误时较为困难。
  • 上一篇:【C++】STL简介
    下一篇:【Linux】进程间通信----共享内存

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月30日 23时23分12秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点) 2023-01-24
    ElasticSearch - 基于 docker 部署 es、kibana,配置中文分词器、扩展词词典、停用词词典 2023-01-24
    ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合 2023-01-24
    ElasticSearch - 基于 JavaRestClient 操作索引库和文档 2023-01-24
    ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮) 2023-01-24
    ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能 2023-01-24
    20241012更新_yum install 找不到合适的yum源_yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067 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
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制) 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