【C++基础知识】C++类型特征组合:`disjunction_v` 和 `conjunction_v` 深度解析

这两个模板是C++17引入的类型特征组合工具,用于构建更复杂的类型判断逻辑。下面我将从技术实现到实际应用进行全面剖析:

一、基本概念与C++引入版本

1. std::disjunction_v (逻辑OR)

  • 引入版本:C++17
  • 功能:对多个类型特征进行逻辑或运算
  • 等价形式T1::value || T2::value || ... || Tn::value
  • 别名模板disjunction_v<T...>disjunction<T...>::value 的简写

2. std::conjunction_v (逻辑AND)

  • 引入版本:C++17
  • 功能:对多个类型特征进行逻辑与运算
  • 等价形式T1::value && T2::value && ... && Tn::value
  • 别名模板conjunction_v<T...>conjunction<T...>::value 的简写

二、底层实现原理

1. disjunction 的可能实现

template<class...> struct disjunction : std::false_type {};
template<class B1> struct disjunction<B1> : B1 {};
template<class B1, class... Bn>
struct disjunction<B1, Bn...> : std::conditional_t<B1::value, B1, disjunction<Bn...>> {};

2. conjunction 的可能实现

template<class...> struct conjunction : std::true_type {};
template<class B1> struct conjunction<B1> : B1 {};
template<class B1, class... Bn>
struct conjunction<B1, Bn...> : std::conditional_t<B1::value, conjunction<Bn...>, B1> {};

关键特性:

  • 短路求值:类似运行时||&&的行为
  • 继承结果类型:保留第一个确定结果的特征类型

三、与传统方式的对比

C++11/C++14实现方式

// 使用std::integral_constant手动组合
template<typename T>
using is_arithmetic_or_enum = std::integral_constant<bool,std::is_arithmetic<T>::value || std::is_enum<T>::value>;

C++17新方式

template<typename T>
using is_arithmetic_or_enum = std::disjunction<std::is_arithmetic<T>, std::is_enum<T>>;

优势对比:

特性传统方式C++17方式
可读性较差更接近逻辑表达式
编译错误信息难以理解更清晰
短路求值需要手动实现自动支持
嵌套组合复杂模板嵌套线性参数列表

四、在Quill中的典型应用

1. 多类型条件判断

if constexpr (std::disjunction_v<std::is_arithmetic<Arg>,std::is_enum<Arg>,std::is_same<Arg, void const*>>)
{// 处理基础类型
}

2. 复合类型检查

else if constexpr (std::conjunction_v<std::is_array<Arg>,std::is_same<remove_cvref_t<remove_extent_t<Arg>>, char>>)
{// 处理字符数组
}

五、技术细节深入

1. 短路求值示例

using T = std::disjunction<std::is_pointer<int*>,        // truesome_invalid_expression<void> // 不会被实例化
>;
static_assert(T::value); // 安全通过

2. 类型继承特性

using Result = std::disjunction<std::is_floating_point<float>,  // 继承std::true_typestd::is_pointer<int>            // 被短路跳过
>;
static_assert(std::is_same_v<Result, std::true_type>);

六、最佳实践

  1. 优先使用_v后缀

    // 好
    if constexpr (std::disjunction_v<T1, T2>)// 不如前者简洁
    if constexpr (std::disjunction<T1, T2>::value)
    
  2. 组合复杂条件

    template<typename T>
    using is_loggable = std::disjunction<std::is_arithmetic<T>,std::conjunction<std::is_class<T>,has_log_method<T>>
    >;
    
  3. 错误消息改进

    static_assert(std::disjunction_v<is_std_string<T>, is_string_view<T>>,"T must be either std::string or std::string_view");
    

七、性能考量

  • 零运行时开销:全部在编译期解析
  • 编译速度:比手动嵌套模板更快(得益于短路求值)
  • 代码生成:与手写条件等效的机器码

八、与其他特性的结合

1. 与if constexpr组合

template<typename T>
void process(T val) {if constexpr (std::disjunction_v<is_arithmetic<T>, is_enum<T>>) {// 处理数值类型} else if constexpr (is_string_like<T>) {// 处理字符串}
}

2. 与概念(Concepts)对比(C++20)

// C++17方式
template<typename T, typename = std::enable_if_t<std::disjunction_v<is_arithmetic<T>, is_enum<T>>>>
void foo(T);// C++20方式
template<typename T>
requires std::disjunction_v<is_arithmetic<T>, is_enum<T>>
void foo(T);

九、历史演变

C++版本类型特征发展
C++11引入基本的类型特征(type traits)
C++14添加_t后缀别名模板(如remove_const_t
C++17引入disjunction/conjunction_v后缀
C++20概念(Concepts)提供更直观的约束表达

这些工具共同构成了现代C++强大的类型系统基础设施,使模板元编程更加直观和高效。在Quill这样的高性能库中,它们被广泛用于编译期类型分发和优化决策。

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

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

相关文章

私有知识库 Coco AI 实战(二):摄入 MongoDB 数据

在之前的文章中&#xff0c;我们介绍过如何使用《 Logstash 迁移 MongoDB 数据到 Easyseach》&#xff0c;既然 Coco AI 后台数据存储也使用 Easysearch&#xff0c;我们能否直接把 MongoDB 的数据迁移到 Coco AI 的 Easysearch&#xff0c;使用 Coco AI 对数据进行检索呢&…

sql server 与navicat测试后,连接qt

先用Navicat测试和sql的连通性&#xff0c;Navicat和sql连通之后&#xff0c;qt也能和sql连通了。 Navicat和Sqlserver Management 能连上&#xff0c;项目无法连接本地 Navicat 连接SQLServer 数据库 QT国内镜像网站 Navicat连接SqlServer的问题点 Sql Server的基本配置以及使…

2025年3月电子学会青少年机器人技术(六级)等级考试试卷-理论综合

青少年机器人技术等级考试理论综合试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;30 一、单选题(共20题&#xff0c;共80分) 1. 2025年初&#xff0c;中国科技初创公司深度求索在大模型领域迅速崛起&#xff0c;其开源的大模型成为全球AI领域的焦…

spark local模式搭建运行示例

Apache Spark 是一个强大的分布式计算框架&#xff0c;但在本地模式下&#xff0c;它也可以作为一个单机程序运行&#xff0c;非常适合开发和测试阶段。以下是一个简单的示例&#xff0c;展示如何在本地模式下搭建和运行 Spark 程序。 一、环境准备 安装 Java Spark 需要 Java…

【人工智能】解锁 AI 潜能:DeepSeek 大模型迁移学习与特定领域微调的实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLMs)的快速发展,迁移学习与特定领域微调成为提升模型性能的关键技术。本文深入探讨了 DeepSeek 大模型在迁移学习中的…

视频智能分析平台EasyCVR无线监控:全流程安装指南与功能应用解析

在当今数字化安防时代&#xff0c;无线监控系统的安装与调试对于保障各类场所的安全至关重要。本文将结合EasyCVR视频监控的强大功能&#xff0c;为您详细阐述监控系统安装过程中的关键步骤和注意事项&#xff0c;帮助您打造一个高效、可靠的监控解决方案。 一、调试物资准备与…

【k8s系列7-更新中】kubeadm搭建Kubernetes高可用集群-三主两从

主机准备 结合前面的章节,这里需要5台机器,可以先创建一台虚拟机作为基础虚拟机。优先把5台机器的公共部分优先在一台机器上配置好 1、配置好静态IP地址 2、主机名宇IP地址解析 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…

【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战

在日常开发中&#xff0c;SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作&#xff0c;这篇文章将带你系统了解&#xff1a;这两个框架是如何防止 SQL 注入的&#xff0c;我们又该如何写出安全的代码。 什么是 SQL 注入&#…

数据分析案例:医疗健康数据分析

目录 数据分析案例:医疗健康数据分析1. 项目背景2. 数据加载与预处理2.1 加载数据2.2 数据清洗3. 探索性数据分析(EDA)3.1 再入院率概览3.2 按年龄分组的再入院率3.3 住院时长与再入院4. 特征工程与可视化5. 模型构建与评估5.1 数据划分5.2 训练逻辑回归5.3 模型评估6. 业务…

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…

软件设计师/系统架构师---计算机网络

概要 什么是计算机网络&#xff1f; 计算机网络是指将多台计算机和其他设备通过通信线路互联&#xff0c;以便共享资源和信息的系统。计算机网络可以有不同的规模&#xff0c;从家庭网络到全球互联网。它们可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如W…

1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术&#xff08;架构模式/性能优化&#xff09; 业务&#xff08;模型抽象→技术方案&#xff09; 管理&#xff08;团队协作/风险控制&#xff09; 知识体系 基础&#xff1a;CAP/设计模式/网络协议案例&am…

基于STM32的汽车主门电动窗开关系统设计方案

芯片和功能模块选型 主控芯片 STM32F103C8T6:基于 ARM Cortex - M3 内核,有丰富的 GPIO 接口用于连接各类外设,具备 ADC 模块可用于电流检测,还有 CAN 控制器方便实现 CAN 总线通信。它资源丰富、成本低,适合学生进行 DIY 项目开发。按键模块 轻触按键:用于控制车窗的自…

第十三届蓝桥杯 2022 C/C++组 修剪灌木

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P8781 [蓝桥杯 2022 省 B] 修…

6.学习笔记-SpringMVC-拦截器(P71-P74)

1.拦截器简介 拦截器的底层思想是AOP思想 2.拦截器入门案例 &#xff08;一&#xff09;制作拦截器的功能类 一般情况下&#xff0c;拦截器都是给表现层用的&#xff0c;所以创建在controller下。 &#xff08;二&#xff09;配置拦截器的执行位置 在projectinterceptor.…

GAIA-2:用于自动驾驶的可控多视图生成世界模型

25年3月来自英国创业公司 Wayze 的论文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其发布GAIA-1&#xff09; 生成模型为模拟复杂环境提供一种可扩展且灵活的范例&#xff0c;但目前的方法不足…

《算法笔记》10.4小节——图算法专题->最短路径 问题 D: 最短路径

题目描述 有n个城市m条道路&#xff08;n<1000, m<10000)&#xff0c;每条道路有个长度&#xff0c;请找到从起点s到终点t的最短距离和经过的城市名。 输入 输入包含多组测试数据。 每组第一行输入四个数&#xff0c;分别为n&#xff0c;m&#xff0c;s&#xff0c;t…

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目录 深度解析 Kubernetes 配置管理&#xff1a;如何安全使用 ConfigMap 和 Secret一、目录结构二、ConfigMap 和 Secret 的创建1. 创建 ConfigMapconfig/app-config.yaml&#xff1a;config/db-config.yaml&#xff1a; 2. 创建 Secretsecrets/db-credentials.yaml&#xff1a…

数据库之mysql优化

1.引擎&#xff1a; 1.1查看引擎&#xff1a; mysql> show engines; mysql> SHOW VARIABLES LIKE %storage_engine%; mysql> show create table t1; ---查看建表信息1.2 临时指定引擎&#xff1a; mysql> create table innodb1(id int)engineinnodb; 1.3修改…

【Yii2】Yii2框架的一次BUG排查

因为项目需要&#xff0c;最近学习了使用Yii2框架的使用。但毕竟刚上手&#xff0c;好多地方都不清楚。所以就有了这个博客。 1、需求 有这么一个需求&#xff1a; 后台需要访问用户的一个界面。为了界面不出问题&#xff0c;需要传递一个真实存在的Token。但对这个Token没有…