【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.pswp.cn/news/902755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902755.shtml
英文地址,請注明出處:http://en.pswp.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沒有…