Down with typename
1. 隐式类型名的详情
C++20 之前,typename 在一些其他情况下是不必要的:
• 指定继承类的基类型时
• 在构造函数中将初始值传递给基类时
• 在类声明中使用类型成员时
#include <iostream>
struct Impl
{Impl(){ std::cout << "Impl ctor" << std::endl; }
};struct Wrap
{Wrap() { std::cout << "Wrap ctor" << std::endl; }using B = Impl;
};template<typename T>
struct Test : T::B
{Test(): T::B(){typename T::B impl;std::cout << "Test ctor" << std::endl;}
};int main(void)
{Test<Wrap> var;
}
自C++20 起,以下情况为模板形参使用类型成员时,可以跳过typename:
• 在别名声明中(即,使用using 声明类型名称时); 注意,带typedef 的类型声明仍然需要typename
• 当定义或声明函数的返回类型时(除非声明发生在函数或块范围内)
• 声明尾步返回类型时
• 当指定static_cast、const_cast、reinterpret_cast 或dynamic_cast 的目标类型时
• 指定类型时
• 在类中
– 声明数据成员时
– 声明成员函数的返回类型时
– 声明成员函数或友元函数或Lambda 的形参(默认实参可能仍然需要) 时
• 在require 表达式中声明参数类型时
• 为模板的类型参数声明默认值时
• 声明非类型模板形参的类型时
include <iostream>
#include <vector>
#include <array>#define TYPENAMEtemplate<typename T,typename U,
auto Size = TYPENAME U::MaxSize,// typename optional --->item 9
auto ValT = typename T::value_type{}> // typename requiredclass MyClass {// first typename optional --->item 6.asecond typename requiredTYPENAME std::array<typename T::value_type,Size> val;
public:using iterator = TYPENAME T::iterator; // typename optional --->item 1TYPENAME T::iterator begin() const; // typename optionalauto end() const ->TYPENAME T::iterator; // typename optional --->item 6.bvoid print(TYPENAME T::iterator) const; // typename optional --->item 6.ctemplate<typename T2 = TYPENAME T::value_type>//second typename optional --->item 8void assign(T2);
};template<typename T>
TYPENAME T::value_type // typename optional --->item 2
foo(const T& cont, typename T::value_type arg) { // typename requiredtypedef typename T::value_type ValT2; // typename required --->item 1using ValT1 = TYPENAME T::value_type; // typename optional --->item 1typename T::value_type val; // typename requiredtypename T::value_type other1(void); // typename requiredauto other2(void) -> TYPENAME T::value_type; // typename optional --->item 3auto l1 = [] (TYPENAME T::value_type) {}; // typename optionalauto p = new TYPENAME T::value_type; // typename optional --->item 5val = static_cast<TYPENAME T::value_type>(0); // typename optional --->item 4
}template<typename T> struct Array{static constexpr long MaxSize = 100;std::array<T, MaxSize> value;
};
int main(void){MyClass<std::vector<int>, Array<int>> var;
}
相关文章:
Down with typename
1. 隐式类型名的详情 C20 之前,typename 在一些其他情况下是不必要的: • 指定继承类的基类型时 • 在构造函数中将初始值传递给基类时 • 在类声明中使用类型成员时 #include <iostream> struct Impl {Impl(){ std::cout << "Impl ctor" &…...
CSS3背景与渐变
背景与渐变 background-size background-size 属性用于设置背景图像的尺寸。您可以指定绝对或相对单位,或者使用关键词来控制背景图像在元素背景区域中的大小。 .element {background-size: [length | percentage | cover | contain] | [length | percentage] [length | per…...
线性表——链式存储
单链表(有头结点) #include<stdio.h> #include<stdlib.h> //定义 typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型 }LNode,*LinkList; //…...
VUE3和VUE2
VUE3和VUE2 上一篇文章中,我们对VUE3进行了一个初步的认识了解,本篇文章我们来进一步学习一下,顺便看一下VUE2的写法VUE3是否能做到兼容😀。 一、新建组件 我们在components中新建一个组件,名称为Peron,…...
mysql5.5版本安装过程
mysql是关系型数据库的管理系统 将安装包放在 c盘根目录 名称为mysql 在该路径下cmd进入命令执行窗口 出现此页面说明安装成功 需要修改配置文件内容 将my-medium.ini 复制粘贴并改名为 my.ini 并添加如下内容 改好之后在mysql目录下cmd进入命令执行窗口 切换到cd bin …...
工厂生产管理系统
为应对一些国内验厂,如大疆等,他们需要客户有自己的生产管理系统的,但实际很多公司是没有引入ERP这类的系统的,从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目,此项目用到DevExpress的…...
Atlas 200I DK A2安装MindSpore Ascend版本
一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本,Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试,也未尝成功,例如:【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…...
Go 生成UUID唯一标识
什么是UUID 通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。 UUID的目的,是让分散式系统中的所有元素&#x…...
【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练
本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝,并且已经训练好的原始模型。 teacher_mod…...
02.爬虫---HTTP基本原理
02.HTTP基本原理 1.URI 和 URL 的区别2.HTTP 和 HTTPS 的区别3.请求过程 1.URI 和 URL 的区别 URL(Uniform Resource Locator)即-统一资源定位符 URL是用来定位和访问互联网上资源的独特标识,它包括了资源的位置(如IP地址或域名&a…...
HTTP响应的基本概念
目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码:描述了这次HTTP请求是否成功,以及失败的原因。 1)200 ---OK 表示这次访问成功了。 2)404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…...
链栈的存储
单向链表在栈中的存储 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //链栈初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判断链栈是否为空 Status StackEmpty(LinkStack S) {if (S NU…...
常见网络协议及端口号
https://www.cnblogs.com/Snail-yellow/p/17722411.html 常见的网络协议-腾讯云开发者社区-腾讯云 常见的网络协议知识整理_五种常用的网络协议-CSDN博客 端口 协议 常见的网络协议_计算机网络协议有哪些csdn-CSDN博客 协议 常见的网络协议知…...
几张自己绘制的UML图
全部来源于公司项目,使用建模工具 Enterprise Architect。自己做的其余文档(含绘图),因保密协议不便于公开。...
[读论文]精读Self-Attentive Sequential Recommendation
论文链接:https://arxiv.org/abs/1808.09781 其他解读文章:https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征,这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…...
HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…...
开放式耳机2024超值推荐!教你如何选择蓝牙耳机!
开放式耳机的便利性让它在我们的日常生活中变得越来越重要。它让我们摆脱了传统耳机的限制,享受到了更多的自由。不过,市面上的开放式耳机种类繁多,挑选一款既实用又实惠的产品确实需要一些小窍门。作为一位对开放式耳机颇有研究的用户&#…...
程序员搞副业的障碍有那些?
利用信息差是最常见的商业模式 在这个世界上,没有什么是所有人都知道的,信息差总是存在的。 无论是经验、技巧、知识,甚至是常识,都可能是信息差的源泉,而存在信息差的地方就意味着有赚钱的商机。 面对用户需求的金…...
windows7的ie11降级到ie8
重点是要在程序管理窗口中“查看已安装的更新”打开当前系统中已安装更新列表,找到两个IE11的更新(见下图“卸载文件“)并卸载掉,这样windows功能中的ie11才会变成ie8. 打开控制面板 进入面板,点击程序,进…...
楼房vr安全逃生模拟体验让你在虚拟环境中亲身体验火灾的紧迫与危险
消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术,为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练,消防VR安全逃生体验系统包含知识讲解和模拟实训演练,体…...
如何在5分钟内开始使用EmulatorJS:新手完整入门教程
如何在5分钟内开始使用EmulatorJS:新手完整入门教程 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS EmulatorJS是一款基于Web的RetroArch前端工具,让你能够直接在…...
本地大模型的春天,真的来了!
过去几年,本地部署大模型始终面临一个核心矛盾:想要高性能,就必须用百亿甚至千亿参数的大模型,算力成本高到普通用户和中小团队难以承受;想要低成本,就只能用小参数模型,推理能力和智能体表现又…...
ESPS USB MSC 调试全过程记录岸
背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...
告别手动点击!Python脚本批量下载InterPro蛋白质结构域数据(附完整代码)
Python自动化实战:高效批量获取InterPro蛋白质结构域数据 在生物信息学研究中,处理蛋白质结构域数据是许多分析流程的关键起点。手动从InterPro数据库逐个下载数百甚至数千个蛋白质的结构域信息,不仅耗时费力,还容易出错。本文将带…...
哪家血清内毒素含量极低、适合敏感原代细胞培养
原代细胞直接提取自生物组织,保留了大量的体内生理特征,但也因此对体外培养中的外源性抑制因子展现出极高的敏感性。内毒素作为细菌代谢的副产物,即便在极低浓度下也可能诱导原代细胞产生应激反应。针对敏感细胞系的培养,实验室对…...
使用Spring AI Alibaba构建智能体Agent赡
背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...
终极指南:如何免费使用Cursor Pro AI编程助手完整教程
终极指南:如何免费使用Cursor Pro AI编程助手完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...
从夯到拉,锐评大模型岗位!收藏这份进阶指南,小白程序员也能抓住AI红利!
本文详细解析了大模型领域的不同岗位,从底层架构的夯岗位到应用开发的拉岗位,涵盖了预训练工程师、Infra工程师、基座模型优化、后训练、多模态、应用开发工程师、数据工程师、风控/安全、模型评估和Prompt工程师等。文章强调了当前大模型领域的人才缺口…...
MOSFET栅极电路设计全解析:从驱动优化到系统保护
1. MOSFET栅极电路设计基础 MOSFET作为现代电子系统的核心开关器件,其栅极电路设计直接决定了整体性能表现。记得我第一次调试电机驱动板时,就因为栅极电阻选型不当导致MOSFET过热烧毁,这个教训让我深刻认识到栅极设计的重要性。 栅极电路本质…...
【HTML动态交互实战】模拟股市波动可视化系统
1. 从零搭建股市波动可视化系统 最近在做一个金融数据分析的小项目,需要模拟股票价格波动并可视化展示。作为一个前端开发者,我第一时间想到用HTML5 Canvas来实现这个需求。下面就把我的实现思路和踩过的坑分享给大家。 先说说为什么要用Canvas而不是S…...
