赣州网站建设/今天的病毒感染情况
一、类模板术语
1、模板的特化
模板的特化也叫具体化,非常容易理解,就是把模板中的模板参数给定具体的类型。看下面的例子:
//模板
template <typename T,typname N>
class Data
{};
//特化
template<>
class Data<int,int>
{};
特化,特,就是特别的,也就是不同于广泛的,泛型中的特例,这就好明白了。记住,特化前必须有泛型化的定义。
2、全特化
特化分为全特化和偏特化,全特化(full specialization)又称显示特化(explicit specialization)或者显示具体化。指的是把模板类型参数全部给定,像上面的例子就是,这里再举一个简单的:
//模板
template <typename T>
class Data
{};
//全特特化
template<>
class Data<int>
{};
注意,全特化可以有多个版本,如上面的可以是int,也可以是short,也可以是等等。
3、偏特化
偏特化(Partial Specialization),也称为局部特化或者部分特化,顾名思义,其实就是只对部分模板参数进行了特化,也即指定类型。这里不举比较容易理解的,举几个不常见的,一般指针也被当成偏特化:
//模板
template <typename T>
class Data
{};
//指针偏特化
template <typename T>
class Data<T*>
{};
///
//模板
template <typename T,typname N>
class Data
{};
//相同参数偏特化
template<typename T>
class Data<T,T>
{};
//单独偏特化
template<typename N>
class Data<int,N>
{};
4、实例化和显示实例化
实例化也好理解,就是具体使用模板类或者模板函数,就是实例化。但是这里有一个特别的,叫做显示实例化,Explicit Instantiation,它也叫强制实例化,也叫显示具现化(有的可能也叫全实例化,但这个不太清楚,没找到出处)。来看一下它的代码:
template <typename T>
class Stack{};
template class Stack<int>;
和特化的区别在形式上特化有template<>而显示实例化只有template。全特化是指模板参数全部指定,算是活化中的一个特例。而显示实例化是真正的定义出来这个函数,用模板的语义但却如普通类和函数一样使用了。也就是说,实例化的模板,就不再是模板了,和普通的类和函数没有差别。
举一个例子,生产一种配件,正常情况是一种模具(泛型模板),当材料是铜质时,用同一个模板,但里面加了一个标记(特化),而当真正的材料压进模具,出来成品叫实例化。
显示实例化只能一次,而且要在CPP文件中。
4、变量模板
这个在前面刚刚分析过,和constexpr在一起可以在元编程里起到很重要的作用。看下面的代码:
template<typename T>
constexpr T pi{3.1415926535897932385};
注意,这玩意儿也全特化和偏特化,而且最可有意思的是,它的特化类型并不要求与特化模板匹配。
5、非类型模板参数和模板默认参数
这个也很好理解,那模板的形参不是一个不确定的参数而一个已知的类型,默认参数就更好理解了,将其值定义一个确定的值,如果在实例化模板过程中没有给其定义实参,就使用默认的类型为实参,看代码:
//函数非类型模板参数
template<int Val, typename T>T addValue (T x){return x + Val;
}
//类非类型模板参数
template<int const length>
class Buffer
{...};
//默认参数
template<typename T, typename Cont = std::vector<T>>
class Stack {...};
//函数模板默认参数
template<typename T>
void test (T t, int number = 10);
template <typename T,typename N = int>
void test(T t,N n = 0){...}
6、SFINAE和Concepts
Substitution Failure Is Not An Error,替换失败不是错误。用来做模板编译期检查的,常用于模板元编程。可以说如果比较常用到这玩意儿,开发者的水平应该是比较高了。Concepts,概念,可以理解成它的升级版,这个怎么用,在前面反复分析过,这里不再赘述。
7、外部模板
Extern Template,C++11的新功能,主要是减轻编译在大规模编译模板时产生的重复类型实例,降低编译器的工作。它依赖于前面提到的显示实例化,看下面的代码:
//t.h
template <typename T>
void test(T) { }
// t1.cpp
#include "t.h"
template void test<int>(int); // 显式实例化
void call()
{test(0);
}// t2.cpp
#include "t.h"
extern template void fun<int>(int); // 外部模板的声明
void invoke()
{test(3);
}
8、变参模板
c++11推出的参数不固定的模板,看下面的代码:
template <typename ...Args>
class Ex{....};
二、函数模板术语
函数模板与上面术语基本类似,但是函数模板没有偏特化,试想一下,偏特化和重载怎么容易区别呢?但是,在《c++ template》第二版中,却对此提出了一些看法,并且这些想法在c++标准委员会上进行过讨论,只不过没有引起重视罢了。有兴趣可以看看,至于未来会是如何,没人敢说会怎么样。下面看相关的例子:
1、全特化
template <typename T>
void test(T) {...}template<> void test<int>(int); //全特化
2、显示实例化
函数的显示实例化:
template <typename T>
void test(T) {...}//cpp
template void test<int>(int); // 显式实例化
3、变参模板
template <typename ...Args>
void test(Args ... args)
{...}
三、模板中的一些具体术语应用
1、this
在普通的类函数中,一般是推荐使用this用来让代码更清晰的表明这是一个类对象的成员。但好多开发者为了简单,就不写了。但是在模板类的继承中,如果子类继承了父类的成员,如果不显示的使用this,会导致编译错误。这时只需要写上this即可。
2、template限定符
这个前面分析过,就是为了让编译器知道使用的是模板类型,帮助编译器进行类型推导的,类似于:
typename Shell<T>::template In<N>::template Deep<N>& p) {
p.template Deep<N>::f(); // inhibit virtual call
}
3、模板的模板参数
也叫双重模板参数,这个在前面也提到过,就是模板的参数,仍然是模板,类似于下面:
template <template <typename T> class N>
class A{...};
//C++17后
template <template <typename T> typename N>
class A{...};
注意,新手不要把class单纯当成一个类关键字,所以想当然的使用struct,union这些关键字,使用后者都是错误的。切记。
4、右尖括号的优化
在c++11以前,如果模板实例化中遇到连续的两个>>符号,编译器会把它当成右移符号,从而引起编译错误,所以要在两个右尖括号中间打一个空格,这也是看老的代码时的一个风景,但在c++11之后已经优化正常使用了。例如:
template <typename T>
class Data
{typedef T type;};
template <typename T>
class D
{};Data<D<int>>::type d;//此御的右双尖括号
但是这种方法在处理真的">>"右移时,又会和新编译有冲突,错误和解决方式如下:
template <size_t T>
class D
{};D<100>>2> xx;//C++11 error
D<(100>>2)> xx;//OK
5、模板的别名
这个也是为了简化模板编程使用的,都知道在模板编程中,可能会有一个很长的类型定义,但typedef又无法在这种情况下作用,所以老的标准中,一般是定义一个模板类,再把此类型定义到这个模板内进行变相的使用,增加了很多的工作量和理解的复杂度。类似于下面:
typedef unsigned int uint32 //ok
//但是要类似偏特化某个类型,比如下面固定KEY为std::string ,value类型可变
typedef std::map<std::string,std::string> map_string
typedef std::map<std::string,int> map_string
//C++11 prev
template <typename T>
class map_string{typedef std::map<std::string ,T> type;
}
map_string<std::string>::type m1;
//C++11
template <typename T>
using map_string = std::map<std::string,T>;
map_string m1;
6、外部定义成员模板
// member templates outside class
template<typename T>
class A
{
public:template<typename S>void test(const S &s);
};template<typename T>
template <typename S>
void A<T>::test(const S &s)
{...}
四、总结
这些术语有些是比较为通用的,有的是比较少用的,但在某些书籍中又比较权威,所以了解一些还是有用的。特别是侯捷老师的书里,用法有些不同大家可以对比来印证就知道了什么意思。
这里面其实每个都可以单独拿出来讲很多,本篇主要是综合一下,做一个纲领性的说明。以后如果标准继续更迭,可能会继续在此基础上不断的完善。
相关文章:

跟我学c++中级篇——模板的基础术语说明
一、类模板术语 1、模板的特化 模板的特化也叫具体化,非常容易理解,就是把模板中的模板参数给定具体的类型。看下面的例子: //模板 template <typename T,typname N> class Data {}; //特化 template<> class Data<int,int&…...

最新Win10离线安装.NET Framework 3.5的方法(附离线包2022/3/22)
win10系统安装软件时,可能需要.net framework3.5的运行环境,当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NET Framework 3.5(包括.NET 2.0和3.0)。如果系统默认的是4.0以上的版本,当软件需要.net framework3.…...

最新docker多系统安装技术
在Ubuntu操作系统中安装Docker 在Ubuntu操作系统中安装Docker的步骤如下。 1.卸载旧版本Docker 卸载旧版本Docker的命令如下: $ sudo apt-get remove docker docker-engine docker.io 2.使用脚本自动安装 在测试或开发环境中࿰…...

系统架构设计高级技能 · 云原生架构设计理论与实践
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

Springboot集成RocketMQ——简单使用
目录 1.MQ选型 2.RocketMQ基本架构 3.Springboot集成RocketMQ 4.顺序消息 5.延时消息 6.事务消息 1.MQ选型 目前市面上的MQ选型:主要分为3个类型 Kafka:吞吐量大,且性能好,集群高可用;会丢失数据,功…...

第一百二十四回 Flexible组件
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了扩展内容相关的知识,本章回中将介绍 Flexible组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在前面章回中介绍了扩展列表相关的内容,当页面中其它组件和扩展列表一起使…...

关于stm32推挽带有上下拉电阻的思考、IO口驱动能力是什么
1、发现推挽带有上下拉电阻 1.1、stm32手册 记忆中推挽是不需要上下拉的,没关注过,但是我真的理解上下拉吗,下图来自stm32f4的中文版和英文版的数据手册,没有翻译错,就是“推挽带有上下拉的能力”。 1.2、查找相关信…...

考研408 | 【操作系统】 内存管理
内存的基础 内存和内存的作用: 几个常用的数量单位: 指令的工作原理: 问题:如何将指令中的逻辑地址转换为物理地址? 解决办法:装入的三种方式 1.绝对装入 2.可重定位装入 3.动态重定位 从写程序到程…...

C# 工厂模式
一、概述 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在C#中,工厂模式通过定义一个公共接口或抽象类来创建对象,而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…...

在云服务器上安装Jenkins
说明:Jenkins是一个部署项目的平台,通过Jenkins可以省去从项目开发–>部署项目之间的所有流程,做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前,先要在云服务上安装JDK、Maven、Git&#x…...

一文了解SpringBoot中的IOC
目录 1.什么是IOC 2.IOC容器 3.创建IOC容器 4.装配Bean到IOC容器 5.依赖注入 1.什么是IOC IOC:Inversion of Control 控制反转 Sping中我们把一个个对象称为Bean,以前我们实例一个对象的时候,都会直接New一个 而在Spring中࿰…...

docker-compose管理创建LNMP服务并运行Wordpress网站平台
文章目录 一.项目环境1. 环境描述2.项目需求 二.部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照,然后将Docker镜像打包成tar包备…...

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型
【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型👨🏫前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…...

【Python】模块、包
模块 Python模块(Module),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能保护可执行的代码。 不同模块,同名的功能,如果都被导入,那么后者会覆盖前者…...

CMAKE_CUDA_ARCHITECTURES针对Jetson Xavier或者Orin的设置
不同jetson设备对应不同的CMAKE_CUDA_ARCHITECTURES的设置,如下: # TX1, Nano ------ 53 # TX2 ------ 62 # AGX Xavier, NX Xavier ------ 72 # AGX Orin, NX Orin ----…...

sqlite3.OperationalError: unable to open database file解决方法
执行superset时,提示该错误:sqlite3.OperationalError: unable to open database file 由于superset里使用django设置sqlite3数据库。 应该属于django设置sqlite3数据库的问题: OperationalError: unable to open database file 原因 1&a…...
SSL核心概念 SSL类型级别
SSL:SSL(Secure Sockets Layer)即安全套接层,及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 H…...

器件介绍TMP1826NGRR、TMP1826DGKR、TMP1827NGRR、TMP1075NDRLR数字温度传感器
一、TMP1826 具有 2Kb EEPROM 的 1-Wire、0.2C 精度温度传感器 器件介绍 TMP1826 是一款高精度、1-Wire 兼容的数字输出温度传感器,具有集成的 2Kb EEPROM 和 –55C 至150C 的宽工作温度范围。TMP1826 在 10C 至45C 的温度范围内提供 0.1C(典型值&#…...

抖店必须绑定抖音账号吗?聊6个抖店不为人知的小细节,别外传
我是王路飞。 现在做抖店,比如绑定一个抖音账号吗? 了解过抖店的朋友都知道,之前开通抖音小店,是需要绑定一个抖音号作为店铺的官方账号的。 而且属于硬性规定,必须要绑定,否则店铺无法正常运营。 但是…...

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备
文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…...

【趣味随笔】手机参数你真的看懂了吗?
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

微信小程序开发教学系列(4)- 数据绑定与事件处理
4. 数据绑定与事件处理 在微信小程序中,数据绑定和事件处理是非常重要的部分。数据绑定可以将数据和页面元素进行关联,实现数据的动态渲染;事件处理则是响应用户的操作,实现交互功能。本章节将详细介绍数据绑定和事件处理的基本原…...

C++避坑——most vexing parse问题
1."坑"的问题是什么? 先看一段代码: class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…...

利用lammps模拟蓝宝石在水润滑环境下的抛光
一 问题描述 蓝宝石(Al2O3)由于其独特的晶体结构,优异的物理化学特性,被广泛应用于航空航天等领域。高精尖的应用领域要求蓝宝石具有纳米级的表面粗糙度以及严格可控的亚表面缺陷。影响超精密加工最终性能的因素主要集中在工件表…...

3.BGP状态机和路由注入方式
BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…...

微信开发之一键创建微信群聊的技术实现
创建微信群 本接口为敏感接口,请查阅调用规范手册创建后,手机上不会显示该群,往该群主动发条消息手机即可显示。 请求URL: http://域名地址/createChatroom 请求方式: POST 请求头Headers: Content-T…...

设计模式二十:观察者模式(Observer Pattern)
定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。 观察者模式的使用场景 观察者模式在许多场景中都可以发挥…...

Linux操作系统--CentOS使用初体验
我们安装好Linux的操作系统之后,下面就可以使用Linux操作系统了。我们一起来看看如何使用。 (1).桌面 我们在进入CentOS操作系统后可以发现一些和Windows操作系统相类似的情况。如:网络、时间显示、以及基本的软件等内容。 --创建文件、文件夹。 (2).操作终端 Linux中的终…...

搭建HAProxy + Keepalived高可用
安装 在四台虚拟机上,我们以如下方式搭建集群: 192.168.115.3 haproxykeepalived 192.168.115.4haproxykeepalived 192.168.115.5 nginx 192.168.115.6 nginx 在192.168.115.3 和192.168.115.4 上安装haproxy和keepalived(haproxy编译安装…...

使用Python爬虫定制化开发自己需要的数据集
在数据驱动的时代,获取准确、丰富的数据对于许多项目和业务至关重要。本文将介绍如何使用Python爬虫进行定制化开发,以满足个性化的数据需求,帮助你构建自己需要的数据集,为数据分析和应用提供有力支持。 1.确定数据需求和采集目…...