C++标准模板(STL)- 类型支持 (杂项变换,确定一组类型的公共类型,std::common_type)

类型特性

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
 

杂项变换

确定一组类型的公共类型

std::common_type

template< class... T >
struct common_type;

(C++11 起)

确定所有类型 T... 的共用类型,即所有 T... 都能隐式转换到的类型。若这种类型(根据后述规则确定)存在,则成员 type 指名该类型。否则,无成员 type

  • 若 sizeof...(T) 为零,则无成员 type
  • 若 sizeof...(T) 为一(即 T... 只含一个类型 T0 ),则成员 type 指名与 std::common_type<T0, T0>::type 相同的类型,若它存在;否则无成员 type
  • 若 sizeof...(T) 为二(即 T... 含恰好二个成员 T1T2 ),则
  • 若应用 std::decay 到至少 T1T2 中至少一个类型后产生相异类型,则成员 type 指名与 std::common_type<std::decay<T1>::type, std::decay<T2>::type>::type 相同的类型,若它存在;若不存在,则无成员 type
  • 否则,若有对 std::common_type<T1, T2> 的用户定义特化,则使用该特化;
  • 否则, 若 std::decay<decltype(false ? std::declval<T1>() : std::declval<T2>())>::type 是合法类型,则成员 type 代表该类型;

否则,若 std::decay<decltype(false ? std::declval<const T1 &>() : std::declval<const T2 &>())>::type 为合法类型,则成员 type 代表该类型;

(C++20 起)
  • 否则,无成员 type
  • 若 sizeof...(T) 大于二(即 T... 由类型 T1, T2, R... 组成),则若 std::common_type<T1, T2>::type 存在,则成员 type 指代 std::common_type<std::common_type<T1, T2>::type, R...>::type ,若存在这种类型。其他所有情况下,无成员 type

参数包 T 中的类型应均为完整类型、(可为 cv 限定的) void ,或未知边界数组。否则行为未定义。

若上述模板的实例化直接或间接地依赖于不完整类型,并且如果假如使该类型完整,实例化就会产生不同的结果,则行为未定义。

成员类型

名称定义
type所有 T... 的共用类型

辅助类型

template< class... T >
using common_type_t = typename common_type<T...>::type;

(C++14 起)

特化

用户可为类型 T1T2 特化 common_type ,只要

  • T1T2 至少一个依赖于用户定义类型,且
  • std::decay 对于 T1T2 都是同等变换。

若这种特化拥有名为 type 的成员,则它必须是公开且无歧义的成员类型,并指名一个 T1T2 都能显式转换到的,无 cv 限定且非引用的类型。而且, std::common_type<T1, T2>::type 与 std::common_type<T2, T1>::type 必须指代同一类型。

以违背这些规则的方式添加 common_type 特化的程序拥有未定义行为。

注意添加特化到来自 <type_traits> 的任何其他模板的行为是未定义的。

标准库已提供下列特化:

std::common_type<std::chrono::duration>

特化 std::common_type 特征
(类模板特化)

std::common_type<std::chrono::time_point>

特化 std::common_type 特征
(类模板特化)

可能的实现

// 初等模板(用于零个类型)
template <class ...T> struct common_type { }; 一个类型
template <class T>
struct common_type<T> {using type = typename common_type<T, T>::type;
};二个类型// 二个类型的默认实现
template<class T1, class T2>
using cond_t = decltype(false ? std::declval<T1>() : std::declval<T2>());template<class T1, class T2, class=void>
struct common_type_2_default { };template<class T1, class T2>
struct common_type_2_default<T1, T2, std::void_t<cond_t<T1, T2>>> {using type = std::decay_t<cond_t<T1, T2>>;
};// 退化应用特化前的类型的派发器
template<class T1, class T2, class D1 = std::decay_t<T1>, class D2=std::decay_t<T2>>
struct common_type_2_impl : common_type<D1, D2> {};template<class D1, class D2>
struct common_type_2_impl<D1, D2, D1, D2> : common_type_2_default<D1, D2> {};template <class T1, class T2>
struct common_type<T1, T2> : common_type_2_impl<T1, T2> { };3 个以上类型template<class AlwaysVoid, class T1, class T2, class...R>
struct common_type_multi_impl { };template< class T1, class T2, class...R>
struct common_type_multi_impl<std::void_t<common_type_t<T1, T2>>, T1, T2, R...>: common_type<common_type_t<T1, T2>, R...>  { };template <class T1, class T2, class... R>
struct common_type<T1, T2, R...>: common_type_multi_impl<void, T1, T2, R...> { };

注意

对于不是提升目标的算术类型,共用类型可视为如 T0() + T1() + ... + Tn() 的(可以为混合模式的)算术表达式的类型。

调用示例

#include <iostream>
#include <type_traits>
#include <typeinfo>struct C
{
};struct A : C
{
};struct B : C
{
};int main()
{typedef typename std::common_type<int, double>::type Type1;typedef typename std::common_type<char, int>::type Type2;typedef typename std::common_type<std::string, char*>::type Type3;typedef typename std::common_type<bool, int>::type Type4;typedef typename std::common_type<bool, char>::type Type5;typedef typename std::common_type<char, double>::type Type6;typedef typename std::common_type<A, C, B>::type Type7;std::cout << "std::common_type<int, double>::type:          "<< typeid(Type1).name() << std::endl;std::cout << "std::common_type<char, int>::type:            "<< typeid(Type2).name() << std::endl;std::cout << "std::common_type<std::string,double>::type:   "<< typeid(Type3).name() << std::endl;std::cout << "std::common_type<bool, int>::type:            "<< typeid(Type4).name() << std::endl;std::cout << "std::common_type<bool, int>::type:            "<< typeid(Type5).name() << std::endl;std::cout << "std::common_type<char, double>::type:         "<< typeid(Type6).name() << std::endl;std::cout << "std::common_type<A, C, B>::type:              "<< typeid(Type7).name() << std::endl;return 0;
}

输出

std::common_type<int, double>::type:          d
std::common_type<char, int>::type:            i
std::common_type<std::string,double>::type:   NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::common_type<bool, int>::type:            i
std::common_type<bool, int>::type:            i
std::common_type<char, double>::type:         d
std::common_type<A, C, B>::type:              1C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置禁止BT下载的示例

如图1所示,企业内用户通过交换机连接到RouterA的Eth2/0/0,并通过RouterA的GE0/0/1接口连接到WAN侧网络。 现在要求在RouterA上通过配置基于智能应用控制SAC(Smart Application Control)的流分类,禁止企业用户进行BT下载。 图1 配置禁止BT下载的组网图: 操作步骤 1.Rout…

面试题:Spring IOC 为什么能降低耦合?

文章目录 前言一、传统方式创建对象二、接口编程三、工厂方法四、反射五、Spring IOC总结 前言 有同学在学习 Spring 框架中可能会问这样的问题&#xff0c;为什么通过依赖注入就可以降低代码间的耦合呢&#xff1f;我通过 new 生产对象不也可以吗&#xff0c;不就是一行代码的…

爬虫解析-jsonpath (六)

jsonpath只能解析本地文件 jsonpath的使用&#xff1a; obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习&#xff1a;使用jsonpath解析JSON文件 3.使用jsonpath抓取…

7.2 C++11默认函数的控制

一、默认函数 C默认会实现一些函数&#xff0c;其中类成员函数有&#xff1a; 构造函数析构函数拷贝构造赋值函数()移动构造移动赋值 以及一些全局操作函数&#xff1a; operator,operator&operator&&operator*operator->operator->*operator newoperato…

C#语言独立开发完成一个简易的程序(软件)Windows窗体应用程序

1.课程考核具体内容: 每位学生在集成环境Visual Studio 2012下用C#语言独立开发完成一个简易的程序(软件) &#xff0c;要求选择Windows窗体应用程序的方式进行设计与开发&#xff0c;程序(软件)的界面整洁、美观&#xff0c;相关功能的实现没有问题&#xff0c;程序(软件)能正…

Vue + Element 实现按钮指定间隔时间点击

1、业务需求 需要加一个按钮&#xff0c;调用第三方API&#xff0c;按钮十分钟之内只能点击一次&#xff0c;刷新页面也只能点击一次 2、思路 加一个本地缓存的时间戳&#xff0c;通过时间戳计算指定时间内不能点击按钮 3、实现 1&#xff09;vue页面 <template>&l…

海奇(Hichip)编译环境搭建:适用于hclinux及hcrtos

文章目录 一、篇头二、工具安装1. 基础工具2.交叉工具链3. 可选:python 多版本配置三、编译测试1. 编译:hclinux D31002. 编译:hcrtos D3100四、附录1. cmake 版本过低2. version `GLIBC_2.34 not found3. multiple definition of \`yylloc;4. GCC版本查看</

力扣面试150题 | 27.移除元素

力扣面试150题 &#xff5c; 27.移除元素 题目描述解题思路代码实现复杂度分析 题目描述 27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必…

/proc/sys/net/ipv4/ 下网络参数的理解

/proc/sys/net/ipv4/下文件详细解释&#xff1a; /proc/sys/net/ipv4/下文件 /proc/sys/net/ipv4/ip_forward 该文件表示是否打开IP转发。 0&#xff0c;禁止 1&#xff0c;转发 基本用途&#xff1a;如VPN、路由产品的利用&#xff1b; 出于安全考虑&#xff0c;Linux系…

4.Java程序设计-基于springboot得在线考试系统

编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;772162324 摘要&#xff1a; 本文设计并实现了一款基于Spring Boot框架的在线考试系统小程序。随着远程学习和在线教育的普及&#xff0c;对于灵活、便捷的在线考试系统的需求逐渐增加。该小程序…

QT 重定向qdebug输出到自绘界面

因为在嵌入式中调试qt需要查看输出信息,特意写了一个类用户便捷查看qdebug信息 界面如下: 提供了开始,停止,保存,清空,退出功能,具体代码下文给出 文件如下 #ifndef QDEBUGREDIRECT_H #define QDEBUGREDIRECT_H /**qdebug 重定向类 定向到界面控件*李吉磊 2023.12.7* */#in…

指针(四)

因为前期在学驱动&#xff0c;所以花了一天时间借鉴了别的资料&#xff0c;把本科学的C语言捡起来。 指针的基本概念 堆栈有栈顶指针&#xff0c;队列有头指针和尾指针&#xff0c;这些概念中的"指针"本质上是一个整数&#xff0c;是数组的索引&#xff0c;通过指针…

CnetSDK .NET OCR Library SDK Crack

CnetSDK .NET OCR Library SDK Crack CnetSDK .NET OCR Library SDK 是一款高精度 .NET OCR 扫描仪软件&#xff0c;用于从图像中识别字符&#xff0c;如文本、手写和符号。该.NET OCR库软件采用Tesseract OCR引擎技术&#xff0c;将字符识别准确率提高高达99%。通过将 .NET OC…

C++【智能指针】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;为什么需要智能指针&#x…

实验3.5 路由器的单臂路由配置

实验3.5 路由器的单臂路由配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.SWA的基本配置2.RA的基本配置3.在RA上查看接口状态 六、任务验收七、任务小结 一、任务描述 某公司对部门划分了需VLAN之后&#xff0c;发现两个部门之间无法通信&#xff0c;但…

机器学习——logistic回归

目录 一、线性模型与回归 二、基于logistic回归和Sigmoid函数的分类 三、最优化算法 1. 最大似然估计 2. 梯度上升法 3. 训练算法&#xff1a;梯度上升 4. 绘制决策边界 5. 训练算法&#xff1a;随机梯度上升 6. 改进的随机梯度算法 四、从疝气病症预测病马的死亡率 …

生成对抗网络GAN中的潜向量Z是用来做什么的?

在生成对抗网络&#xff08;GAN&#xff09;中&#xff0c;潜在向量 Z 是一个随机噪声向量&#xff0c;通常是从某种分布中采样得到的。这个潜在向量 Z 的作用是引入随机性&#xff0c;使得生成器能够生成多样化、非确定性的输出。 具体来说&#xff0c;潜在向量 Z 的作用包括…

408数据结构备考代码整理和算法思想归纳

一 线性表 (1)顺序表 1 顺序表的定义 typedef struct{int length;//记录当前长度int array[MAX];//表示最大长度为MAX }2插入操作:先判断插入的位序合不合法以及存储空间有没有满。而后插入的位序的后面的所有数相后 移动一位,而后插入,length++; 3删除操作:把删除的…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C/PTA】结构体进阶练习

本文结合PTA专项练习带领读者掌握结构体&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 一帮一7-2 考试座位号7-3 新键表输出7-4 可怕的素质7-5 找出同龄者7-6 排队7-7 军训7-8 双链表 7-1 一帮一 “一帮一学习小组”是中…