详解 c++17 重载类 overload的每一条语句,附实例.
author: hjjdebug
date: 2025年 05月 09日 星期五 16:21:03 CST
description: 详解 c++17 重载类 overload的每一条语句
文章目录
- 1. template 模板类.
- 2. class... Ts 是什么意思?
- 3. template<class... Ts> 是什么意思?
- 4. overload 是什么?
- 5. Ts... 是什么?
- 6. 小结
- 7. using Ts::operator()... 是什么意思?
- 8. overload(Ts...)-> overload<Ts...>
- 9 附上我的研究代码.
- 10. 这个重载类有什么用呢?
我看到了几行奇怪的代码,我想理解它的意思.
template<class... Ts>
struct overload : Ts... {
using Ts::operator()...;
};template<class... Ts>
overload(Ts...)-> AAA<Ts...>;
1. template 模板类.
template 是一个c++关键字,代表模板类.
模板类在编译时是不生成代码的, 当实例化时,给了具体的类型,才生成对应的代码.
2. class… Ts 是什么意思?
如果没有… 而是 class Ts, 它的含义是类型名称 是Ts, 这也是基本使用方法.
其中Ts 是描述符.
而这里 class… Ts, 则表示Ts 代表了很多类型.
Ts 是一个描述符,也可以替换它为你喜欢的名称,它本来是Types简写,用Ts代替已经很简洁了.
3. template<class… Ts> 是什么意思?
是定义一个模板类,它的参数类型有很多种, Ts是型参的名称
4. overload 是什么?
overload 是一个类型的名称, 它是一个普通的描述符
我把overload改成AAA, 编译是照样可以通过的,只不过模板类型的名称就叫AAA了.
5. Ts… 是什么?
Ts… 代表的是多种类型的意思,Ts是型参的名称
这些都是跟编译器的约定,被改编之后的gcc,是理解你的这种用法的.
6. 小结
template<class… Ts>
struct AAA : Ts… {
};
定义了一个模板类型,其名称叫AAA, 该模板输入参数类型很多.
该AAA类型公有继承了它的子类型 各个Types, 因而它可以使用各个子Types 中定义的函数.
struct 的继承默认是公有继承 public 类型, 当然你也可以显示声明为public.
7. using Ts::operator()… 是什么意思?
此处的 using 语句,表明它要使用各基类Ts的() 操作符,使基类的函数操作符为可见.
这样就可以用小括号包住子对象.
如果你注释掉该语句,则s(1),s(“1”),s(st)等编译时都会出现错误,编译器不知道你用小括号包住子变量是什么意思.
其实我们括注子变量当然是构造对象时传递的一个参数的意思,
不知道模板类为什么不把它做为一种默认的行为?
而必需要我们显示的像上面那样来说明.
8. overload(Ts…)-> overload<Ts…>
-> 代表推导的意思.
它告诉gcc, 当你碰到overload(Ts…)的使用方法时,就去实例化一个overload<Ts…>类型
这里我也有点不清楚,这难道不应该是默认的行为吗? 为什么还要我们显示说明呢?
也就是说按我的意思,只要用了…多类型,就不用声明using,及模板类型推导语句,岂不是更简洁!
9 附上我的研究代码.
cat main.cpp
#include <iostream>
#include <string>
using namespace std;
//class... Ts,说明Ts可代表多种类型
template<class... Ts>
//AAA 类继承了Ts类, Ts...表示多种类型
struct AAA : Ts... {// using 关键字,引入基类Ts::operator(),使其到父类作用域中//此处using 的作用是防止基类函数被隐藏//基类函数被隐藏是说当基类中有一个函数,派生类中有同名函数,则基类函数被隐藏.//有多个operator(), 将来会调用那一个? 这是编译器的函数重载功能.using Ts::operator()...; // 注释掉该语句, s(1)调用会出现error: request for member ‘operator()’ is ambiguous
};//class 说明是一种类型,...是多种类型,Ts是一个标识符,代表类型types
template<class... Ts>
//Ts... Ts,任意类型...任意个数
//推导规则,当调用AAA(Ts...),推导出类型AAA<Ts...>
//注释掉该语句,当声明AAA变量s 时,
//会有错误 cannot deduce template arguments of ‘AAA<Ts>’, as it has no viable deduction guides
AAA(Ts...)-> AAA<Ts...>;
//这是给编译器沟通的语言,通过构造函数的参数类型,推导出模板的类型
//所以这种写法几乎构成了固定的搭配typedef struct _Test
{int a;int b;//这里的operator() 给模板类中的using Ts::operator 没有任何关联void operator()(struct _Test st){cout<<"struct _Test"<<st.a<<endl;}
}Test;
int main() {//定义一个AAA类型的变量s,其有有2种构造函数,当参数类型为int时,为一种,当参数类型为string时,为另一种//AAA 实际的功能是一个重载类型AAA s{ //多个lamda 表达式[](int){ cout << "int" << endl; }, [](string){ cout << "string" << endl;},[](Test){ cout << "Test struct"<<endl;}};Test st;s(1); // int 参数,与AAA:: using Ts::operator() 有关联,变量函数式.s("1"); // string参数,与AAA:: using Ts::operator() 有关联s(st); //自定义的struct _Test 类型, 也与AAA:: using Ts:operator()有关联cout<<"sizeof(AAA):"<<sizeof(s)<<endl; //AAA类型大小是一个象征性大小1,它是不占用内存的.
}
代码的执行结果:
$ ./overload
int
string
Test struct
sizeof(AAA):1
10. 这个重载类有什么用呢?
这个重载类,它不是装东西的,因为它实例的大小只是象征性大小1.
但它能够根据不同的参数类型,调用不同的构造函数.
这是跟编译器的约定.
跟编译器约好了模板,约好了…,约好了由参数类型导出模板类型(需显式说明),约好了函数式子类型(需显式说明)
就这么点意思,搞的好复杂.有这个必要吗?语言的复杂性正在掩盖一些本质的东西.
使用起来似乎能简洁一点,但理解起来复杂了一点.
相关文章:
详解 c++17 重载类 overload的每一条语句,附实例.
author: hjjdebug date: 2025年 05月 09日 星期五 16:21:03 CST description: 详解 c17 重载类 overload的每一条语句 文章目录 1. template 模板类.2. class... Ts 是什么意思?3. template<class... Ts> 是什么意思?4. overload 是什么?5. Ts...…...

机器学习-数据集划分和特征工程
一.数据集划分 API函数: sklearn.model_selection.train_test_split(*arrays,**options) 参数: - arrays:多个数组,可以是列表,numpy数组,也可以是dataframe数据框等 - options:&…...

MySQL C API高效编程:C语言实现数据库操作的深入解析
知识点【MySQL C API】 1、头文件及MYSQL * 句柄 //头文件 #include <mysql/mysql.h>1、MYSQL MYSQL是一个结构体,封装了与数据库连接相关的所有状态,配置和数据。 2、MYSQL *的本质 类似于 FILE*,代表一个与数据库连接的通道&…...

MySQL初阶:数据库约束和表的设计
数据库约束 数据库约束是针对数据库中的表中的数据进行施加规则和条件,用于确保数据的准确性和可靠性。 数据库约束类型 1)not null 非空类型 :指定非空类型的列不能存储null,如果插入的数据是null便会报错。 2)de…...

LeetCode 解题思路 47(最长回文子串、最长公共子序列)
解题思路: dp 数组的含义: dp[i][j] 是否为回文子串。递推公式: dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化: 单字符 dp[i][i] true,双字符 dp[i][i 1] s.charAt(i) s.charA…...
左支座加工工艺与钻φ25孔专用夹具设计
1 零件结构与工艺分析 1.1 零件结构特征 本左支座为典型箱体类零件,采用HT200灰铸铁铸造毛坯。主体结构包含: 20015080mm安装基面 2φ12定位孔(公差H7) φ250.02主轴承孔(表面粗糙度Ra1.6) 4M10螺纹安…...
基于Qwen-14b的基础RAG实现及反思
1、概览 本文主要介绍RAG的基础实现过程,给初学者提供一些帮助,RAG即检索增强生成,主要是两个步骤:检索、生成,下面将基于这两部分进行介绍。 2、检索 检索的主要目的是在自定义的知识库kb中查询到与问题query相关的候…...

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算
目录 一、结构体(struct关键字) (一)声明一个结构体数据类型 (二)结构体的成员初始化与赋值 a、结构体变量赋值 b、结构体成员初始化 c、结构体的定义形式 (三)考点ÿ…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
N6715C 基础型定制配置直流电源分析仪
N6715C 基础型定制配置直流电源分析仪 综述 N6715C 是一款可定制的直流电源分析仪系统,在装运之前已经过全面测试并组装完毕。 每台 N6715C 包括一个 N6705C 主机和 1 至 4 个模块。 模块作为 E6715C 的选件订购。 主要特点 ◆ ◆ 4 插槽主机最多可安装 4 个模块…...
4.1【LLaMA-Factory 实战】医疗领域大模型:从数据到部署的全流程实践
【LLaMA-Factory实战】医疗领域大模型:从数据到部署的全流程实践 一、引言 在医疗AI领域,构建专业的疾病诊断助手需要解决数据稀缺、知识专业性强、安全合规等多重挑战。本文基于LLaMA-Factory框架,详细介绍如何从0到1打造一个垂直领域的医…...

《软件项目经济性论证报告模板:全面解析与策略建议》
《软件项目经济性论证报告模板:全面解析与策略建议》 一、引言 1.1 项目背景阐述 在数字化浪潮席卷全球的当下,各行业对软件的依赖程度日益加深。[行业名称] 行业也不例外,随着业务规模的不断扩张、业务复杂度的持续提升以及市场竞争的愈发激烈,对高效、智能、定制化软件…...
腾讯云:数字世界的“量子熔炉”与硅基文明引擎
一、算力拓扑学:重新定义空间的计算密度 腾讯云的算力网络正在突破经典物理限制,其分布式架构通过“量子化”资源调度实现超维计算: 虚拟化跃迁:基于KVM的轻量级虚拟化技术,将单台物理服务器切割为百…...
Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
文章目录 前言解决方案gradlemaven 仓库 前言 我们在Android 开发的过程中,经常会遇到三方依赖下载不下来的问题。一般情况下我们会在项目的build.gradle文件中配置多个 maven 仓库来解决。 // Top-level build file where you can add configuration options com…...

关税冲击下,FBA国际物流企业如何靠智能拓客跑出增长“加速度”?
国际物流行业正迎来前所未有的增长机遇。据中研普华最新报告,2025年全球物流市场规模已突破6.27万亿美元,其中中国跨境物流市场预计达2.71万亿元。在全球化与数字化双轮驱动下,国际物流从“规模扩张”迈向“价值重构”。可以说,国…...

vue源代码采用的设计模式分解
No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...
【java反射修改注解属性】java 通过反射,动态修改注解的某个属性值
有些情况为了偷懒,往往会使用注解来动态处理一些功能,比如Excel的导入以及导出等。但是一些情况下我们需要动态的修改注解的属性值,来完成一些特定场景的业务需求。 java动态修改注解的属性代码 public void updateFieldAnnotationVal(String…...

使用 JavaScript 实现数据导出为 Excel 和 CSV 文件
在 Web 开发中,经常会遇到需要将数据导出为文件的需求,例如将数据导出为 Excel 或 CSV 文件。今天,我们就来探讨如何使用 JavaScript 实现这一功能。 一、实现思路 我们通过 HTML 创建一个按钮,点击按钮时,触发 Java…...

eNSP中路由器RIP协议配置完整实验实验和命令解释
一、实验拓扑 二、配置命令 R1配置并先测试一下连通性 R1、R2和R3接口配置完后再测试连通性,直连路由可通 启动RIP进程,宣告直连网络 查看路由表,测试连通性 环回接口配置 三、命令解释及注意事项 配置命令逐行解释 system-view: 从用户视…...

密码学--AES
一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 (1)利用C语言实现字节代换和逆向字节代换,字节查S盒代换 (2)利…...

Vue项目中实现自定义连线图
需求描述 在vue项目中实现由自定义块元素组成的连线图。效果图 实现思路 Leader-Line 是一个用于 Web 的轻量级 JavaScript 库,专为创建从一个元素指向另一个元素的引导线而设计。它提供了高度自定义的能力,使得开发者能够轻松地在网页上实现各种指引用…...
linux中的日志分割
1.问题背景,nginx日志过大不好删除 [rootlocalhost cron.daily]# cd /lk/nginx/log/ [rootlocalhost log]# ll 总用量 2386188 -rw-r--r--. 1 root root 2078699697 5月 9 13:02 access.log -rw-r--r--. 1 root root 11138 5月 6 10:28 error.log [rootloc…...

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)
第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…...
独立自主的网络浏览器——Ladybird
独立自主的网络浏览器——Ladybird 随着互联网技术的飞速发展,浏览器作为人们探索网络世界的窗口,其技术创新和安全措施至关重要。然而,市场上绝大多数浏览器都是基于现有的成熟引擎进行开发,如何创新突破,成为一个独…...

Shiro(八):JWT介绍
1、什么是JWT? JWT(JSON Web Token,JSON Web令牌)是一种开放标准(RFC 7519),用于在网络应 用环境间安全地传递声明(claims)作为JSON对象;JWT会按指定的加密算…...

【HDLBits刷题】Verilog Language——1.Basics
目录 一、题目与题解 1.Simple wire(简单导线) 2.Four wires(4线) 3.Inverter(逆变器(非门)) 4.AND gate (与门) 5. NOR gate (或非门&am…...
SCDN是什么?
SCDN是安全内容分发网络的简称,它在传统内容分发网络(CDN)的基础上,集成了安全防护能力,旨在同时提升内容传输速度和网络安全性。 SCDN的核心功能有: DDoS防御:识别并抵御大规模分布式拒绝服务…...

Python 常用内置函数详解(十):help()函数——查看对象的帮助信息
目录 一、语法参考二、示例 一、语法参考 help() 函数的语法格式如下: 参数说明: request:可选参数,要查看其帮助信息的对象,如类、函数、模块、数据类型等;返回值:返回对象的帮助信息。 二…...

【Python系列】Python 中的 HTTP 请求处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

辉芒微离线烧录器“文件格式错误”问题解决
最近在使用辉芒微离线烧录器烧录程序时,提示“文件格式错误”,记录一下解决方法。 一、问题现象 经过多次尝试和排查,发现以下几种情况: 情况一:使用离线烧录器导入固件1(boot程序),…...