当前位置: 首页 > 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;
}

http://www.lryc.cn/news/352800.html

相关文章:

  • CSS3背景与渐变
  • 线性表——链式存储
  • VUE3和VUE2
  • mysql5.5版本安装过程
  • 工厂生产管理系统
  • Atlas 200I DK A2安装MindSpore Ascend版本
  • Go 生成UUID唯一标识
  • 【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练
  • 02.爬虫---HTTP基本原理
  • HTTP响应的基本概念
  • 链栈的存储
  • 常见网络协议及端口号
  • 几张自己绘制的UML图
  • [读论文]精读Self-Attentive Sequential Recommendation
  • HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)
  • 开放式耳机2024超值推荐!教你如何选择蓝牙耳机!
  • 程序员搞副业的障碍有那些?
  • windows7的ie11降级到ie8
  • 楼房vr安全逃生模拟体验让你在虚拟环境中亲身体验火灾的紧迫与危险
  • rust 学习--所有权
  • 关于Git 的基本概念和使用方式
  • 《计算机网络微课堂》1-6 计算机体系结构
  • 大模型的灵魂解读:Anthropic AI的Claude3 Sonnet可解释性研究
  • 大模型框架:vLLM
  • SQL 使用心得【持续更新】
  • 基于Spring Boot的高校图书馆管理系统
  • python(4) : pip安装使用国内源
  • 让写书人勇敢穿越纸海的迷雾
  • ROS2学习——节点话题通信(2)
  • 【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结