【C++】模板学习(二)

模板学习

  • 非类型模板参数
  • 模板特化
    • 函数模板特化
    • 类模板特化
      • 全特化
      • 偏特化
  • 模板分离编译
  • 模板总结

非类型模板参数

模板参数除了类型形参,还可以是非类型的形参。
非类型形参要求用一个常量作为类(函数)模板的一个参数。这个参数必须是整形家族的。浮点数,字符串等都是不允许用作非类型模板参数的。
非类型模板参数在编译期间就已经确定结果了。

// N 就是定义的非类型模板参数
template <class T, size_t N = 10>
class array
{
private:T _array[N];
};

模板特化

模板可以帮助泛型编程,但当处理到一些特殊类型的时候可能也会出错。

template<class T>
bool Less(T num1, T num2)
{return num1 < num2;
}
void Test1()
{cout << Less(1, 2) << endl;int a = 1;int b = 2;int* pa = &a;int* pb = &b;cout << Less(pa, pb) << endl;
}

从上面代码可以看到,pa指向的a是小于pb指向的b的,Less并没有比较papb所指向的对象的内容,而只能比较papb指针的地址,导致出现错误结果。
此时可以通过对模板的特化来处理问题:在原模板的基础上,针对特殊类型采用特殊化的的实现方式。
模板特化可以分为函数模板特化和类模板特化,先来看函数模板特化。

函数模板特化

模板的特化必须先有一个基础的模板。
函数模板特化方式:
关键字template后面接一对空的尖括号<>
函数名后跟一对尖括号<>,尖括号中指定需要特化的类型;
函数形参表中参数的类型要和指定特化的类型呼应。

template<class T>
bool Less(T num1, T num2)
{return num1 < num2;
}template<>
bool Less<int*>(int* num1, int* num2)
{return *num1 < *num2;
}void Test2()
{cout << Less(1, 2) << endl;int a = 1;int b = 2;int* pa = &a;int* pb = &b;cout << Less(pa, pb) << endl;
}

一般情况下对于函数模板处理有困难的类型,也可以直接给出,这样实现简单明了,代码可读性也更高。

bool Less(int* num1, int* num2)
{return *num1 < num2;
}

类模板特化

全特化

顾名思义,就是将模板参数列表中所有的类型参数都确定化。

template<class T1, class T2>
class A
{
public:A(){cout << "A<T1, T2>" << endl;}
};template<>
class A<int, double>
{
public:A(){cout << "A<int, double>" << endl;}
};void Test3()
{A<int, int> a1;A<int, double> a2;
}

在这里插入图片描述

偏特化

偏特化有两种表现方式:

  1. 部分特化
    将模板参数列表中的部分类型参数进行特化。
template<class T1, class T2>
class A
{
public:A(){cout << "A<T1, T2>" << endl;}
};template<class T1>
class A<T1, int>
{
public:A(){cout << "A<T1, int>" << endl;}
};void Test4()
{A<int, int> a1;A<int, double> a2;
}

在这里插入图片描述

  1. 对参数更进一步的特化
template<class T1, class T2>
class A
{
public:A(){cout << "A<T1, T2>" << endl;}
};template<class T1, class T2>
class A<T1*, T2*>
{
public:A(){cout << "A<T1*, T2*>" << endl;}
};template<class T1, class T2>
class A<T1&, T2&>
{
public:A(){cout << "A<T1&, T2&>" << endl;}
};void Test5()
{A<int, double> a1;A<int*, double*> a2;A<int&, double&> a3;
}

在这里插入图片描述

模板分离编译

将一个程序中所有源文件单独编译成目标文件,最后所有目标文件链接形成一个可执行文件的过程就称为分离编译模式。
对于模板分离编译的问题可以参考刘未鹏大佬在CSDN上的这篇博客 为什么C++编译器不能支持对模板的分离式编译。
知道了模板分离编译时,链接会出错的原因是,分开编译的模板定义不能够实例化,符号导出表中没有其对应的符号地址以供链接。
所以解决模板分离编译可以将声明和定义都放到一个xxx.hppxxx.h文件中。

模板总结

模板体现了复用和泛型编程,标准模板库(STL)的实现离不开模板。
同时,模板也可能导致代码膨胀问题,导致编译时间变长。模板的报错也会导致错误信息凌乱,不易定位错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust的入门篇(中)

Rust的入门篇(中) 这是接上面一篇rust入门篇(上)文章 22. 包管理一 mod nation {pub mod government {pub fn govern() {}}mod congress {pub fn legislate() {}}mod court {fn judicial() {super::congress::legislate();}} }fn main() {nation::government::govern(); }23.…

pytorch学习——正则化技术——丢弃法(dropout)

一、概念介绍 在多层感知机&#xff08;MLP&#xff09;中&#xff0c;丢弃法&#xff08;Dropout&#xff09;是一种常用的正则化技术&#xff0c;旨在防止过拟合。&#xff08;效果一般比前面的权重衰退好&#xff09; 在丢弃法中&#xff0c;随机选择一部分神经元并将其输出…

Vue 常用指令 v-model 双向数据绑定

之前的指令&#xff0c;无论使用哪一种&#xff0c;都是在代码当中定义的内容。在web开发当中经常要去获取用户的输入&#xff0c;v-model可以十分方便的将表单的值和实例当中的数据关联起来。 这样就可以十分便捷的获取和设置表单元素的值了。&#xff08;注意是表单元素&…

SpringBoot第29讲:SpringBoot集成MySQL - MyBatis-Plus代码自动生成

SpringBoot第29讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus代码自动生成 本文是SpringBoot第29讲&#xff0c;主要介绍 MyBatis-Plus代码自动生成&#xff0c;以及产生此类代码生成工具的背景和此类工具的基本实现原理。 文章目录 SpringBoot第29讲&#xff1a;SpringBo…

【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…

PHP高级检索功能的实现以及动态拼接sql

我们学习了解了这么多关于PHP的知识&#xff0c;不知道你们对PHP高级检索功能的实现以及动态拼接sql是否已经完全掌握了呢&#xff0c;如果没有&#xff0c;那就跟随本篇文章一起继续学习吧! PHP高级检索功能的实现以及动态拼接sql。完成的功能有&#xff1a;可以单独根据一个…

华为云hcip核心知识笔记(数据库服务规划)

华为云hcip核心知识笔记&#xff08;数据库服务规划&#xff09; 1.云数据接库优势 1.1云数据库优点有&#xff1a; 易用性强&#xff1a;能欧快速部署和运行 高扩展&#xff1a;开放式架构和云计算存储分离 低成本&#xff1a;按需使用&#xff0c;成本更加低廉 2.云数据库r…

微软开测“Moment4”启动包:Win11 23H2要来了

近日&#xff0c; 有用户在Win11最新的7月累积更新中发现&#xff0c;更新文件中已经开始出现了对“Moment4”的引用。 具体来说&#xff0c;在7月累积更新中&#xff0c;微软加入了“Microsoft-Windows-UpdateTargeting-ClientOS-SV2Moment4-EKB”“Microsoft-Windows-23H2Ena…

2023年【零声教育】13代C/C++Linux服务器开发高级架构师课程体系分析

对于零声教育的C/CLinux服务器高级架构师的课程到2022目前已经迭代到13代了&#xff0c;像之前小编也总结过&#xff0c;但是课程每期都有做一定的更新&#xff0c;也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求&#xff0c;之前课程里面也包含了一些小的分支&#…

使用Vue.js和Rust构建高性能的物联网应用

物联网(IoT)应用是现代技术的重要组成部分&#xff0c;它们可以在各种场景中&#xff08;例如智能家居&#xff0c;工业自动化等&#xff09;提供无缝的自动化解决方案。在这篇文章中&#xff0c;我们将探讨如何使用Vue.js和Rust构建高性能的物联网应用。 1. 为什么选择Vue.js…

音频客观感知MOS对比,对ViSQOL、PESQ、MosNet(神经网络MOS分)和polqa一致性对比和可信度雁阵

原创&#xff1a;转载需附链接&#xff1a; 音频客观感知MOS对比&#xff0c;对ViSQOL、PESQ、MosNet&#xff08;神经网络MOS分&#xff09;和polqa一致性对比和可信度雁阵_machine-lv的博客-CSDN博客谢谢&#xff01; 本文章以标准polqa的mos分为可信前提&#xff0c;验证vis…

MPAndroidChart学习及问题处理

1.添加依赖 项目目录->app->build.gradle dependencies {implementation com.github.PhilJay:MPAndroidChart:v3.0.3 }项目目录->app->setting.gradle dependencyResolutionManagement {repositories {maven { url https://jitpack.io }} }高版本的gradle添加依…

Ceph错误汇总

title: “Ceph错误汇总” date: “2020-05-14” categories: - “技术” tags: - “Ceph” - “错误汇总” toc: false original: true draft: true Ceph错误汇总 1、执行ceph-deploy报错 1.1、错误信息 ➜ ceph-deploy Traceback (most recent call last):File "/us…

2023年第四届“华数杯”数学建模思路 - 案例:感知机原理剖析及实现

# 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其原理可以看下图&#xff1a; 比如说我们有一个坐标轴&#xff08;图中的…

关于视频汇聚融合EasyCVR平台多视频播放协议的概述

视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台既具备传统安防视频监控的能力与服务&#xff0c;也支持AI智能检测技术的接入&#xff0c;可应用在多行业领域的智能化监管场…

Python简单应用II

#第一题&#xff1a; 将字符串joy存放于列表l1中&#xff0c;按要求完成如下操作。元素添加操作&#xff1a; 1&#xff09;在列表l1的尾部添加空白字符&#xff0c; 2&#xff09;在列表l1的尾部添加字符串singing&#xff0c; 3&#xff09;在列表l1的首部添加字符串I e&…

直线模组如何进行精度校准?

直线模组是一种高精度的传动元件&#xff0c;而精度是直线模组的重要指标&#xff0c;在直线模组的使用中&#xff0c;我们应该尽可能的避免直线模组的精度受损&#xff0c;这样才能够有真正的发挥出直线模组的稳定性。 直线模组的精度一般是指重复定位精度和导向精度&#xff…

React常见面试题

React常见面试题 一、React中的样式管理有哪些方法 内联样式&#xff1a;对象&#xff0c;作用于当前组件普通样式表&#xff1a; 作用于全局&#xff0c;文件名是&#xff1a;xxx.scssCSS模块&#xff1a;类似Vue的scoped&#xff0c; 文件名需是&#xff1a;xxx.module.scs…

代客泊车对HUT功能交互规范

目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统&#xff08;环视和超声波雷达&#xff09;...…