当前位置: 首页 > news >正文

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 之前&#xff0c;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…...

线性表——链式存储

单链表&#xff08;有头结点&#xff09; #include<stdio.h> #include<stdlib.h> //定义 typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点&#xff0c;所以是 struct LNode类型 }LNode,*LinkList; //…...

VUE3和VUE2

VUE3和VUE2 上一篇文章中&#xff0c;我们对VUE3进行了一个初步的认识了解&#xff0c;本篇文章我们来进一步学习一下&#xff0c;顺便看一下VUE2的写法VUE3是否能做到兼容&#x1f600;。 一、新建组件 我们在components中新建一个组件&#xff0c;名称为Peron&#xff0c;…...

mysql5.5版本安装过程

mysql是关系型数据库的管理系统 将安装包放在 c盘根目录 名称为mysql 在该路径下cmd进入命令执行窗口 出现此页面说明安装成功 需要修改配置文件内容 将my-medium.ini 复制粘贴并改名为 my.ini 并添加如下内容 改好之后在mysql目录下cmd进入命令执行窗口 切换到cd bin …...

工厂生产管理系统

为应对一些国内验厂&#xff0c;如大疆等&#xff0c;他们需要客户有自己的生产管理系统的&#xff0c;但实际很多公司是没有引入ERP这类的系统的&#xff0c;从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目&#xff0c;此项目用到DevExpress的…...

Atlas 200I DK A2安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试&#xff0c;也未尝成功&#xff0c;例如&#xff1a;【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…...

Go 生成UUID唯一标识

什么是UUID 通用唯一识别码&#xff08;英语&#xff1a;Universally Unique Identifier&#xff0c;简称UUID&#xff09;是一种软件建构的标准&#xff0c;亦为自由软件基金会组织在分散式计算环境领域的一部份。 UUID的目的&#xff0c;是让分散式系统中的所有元素&#x…...

【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练

本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝&#xff0c;并且已经训练好的原始模型。 teacher_mod…...

02.爬虫---HTTP基本原理

02.HTTP基本原理 1.URI 和 URL 的区别2.HTTP 和 HTTPS 的区别3.请求过程 1.URI 和 URL 的区别 URL&#xff08;Uniform Resource Locator&#xff09;即-统一资源定位符 URL是用来定位和访问互联网上资源的独特标识&#xff0c;它包括了资源的位置&#xff08;如IP地址或域名&a…...

HTTP响应的基本概念

目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码&#xff1a;描述了这次HTTP请求是否成功&#xff0c;以及失败的原因。 1&#xff09;200 ---OK 表示这次访问成功了。 2&#xff09;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图

全部来源于公司项目&#xff0c;使用建模工具 Enterprise Architect。自己做的其余文档&#xff08;含绘图&#xff09;&#xff0c;因保密协议不便于公开。...

[读论文]精读Self-Attentive Sequential Recommendation

论文链接&#xff1a;https://arxiv.org/abs/1808.09781 其他解读文章&#xff1a;https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征&#xff0c;这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…...

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…...

开放式耳机2024超值推荐!教你如何选择蓝牙耳机!

开放式耳机的便利性让它在我们的日常生活中变得越来越重要。它让我们摆脱了传统耳机的限制&#xff0c;享受到了更多的自由。不过&#xff0c;市面上的开放式耳机种类繁多&#xff0c;挑选一款既实用又实惠的产品确实需要一些小窍门。作为一位对开放式耳机颇有研究的用户&#…...

程序员搞副业的障碍有那些?

利用信息差是最常见的商业模式 在这个世界上&#xff0c;没有什么是所有人都知道的&#xff0c;信息差总是存在的。 无论是经验、技巧、知识&#xff0c;甚至是常识&#xff0c;都可能是信息差的源泉&#xff0c;而存在信息差的地方就意味着有赚钱的商机。 面对用户需求的金…...

windows7的ie11降级到ie8

重点是要在程序管理窗口中“查看已安装的更新”打开当前系统中已安装更新列表&#xff0c;找到两个IE11的更新&#xff08;见下图“卸载文件“&#xff09;并卸载掉&#xff0c;这样windows功能中的ie11才会变成ie8. 打开控制面板 进入面板&#xff0c;点击程序&#xff0c;进…...

楼房vr安全逃生模拟体验让你在虚拟环境中亲身体验火灾的紧迫与危险

消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术&#xff0c;为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练&#xff0c;消防VR安全逃生体验系统包含知识讲解和模拟实训演练&#xff0c;体…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...