C++法則15:匹配失敗并不是一種錯誤(Substitution Failure Is Not An Error)。

C++法則15:匹配失敗并不是一種錯誤(Substitution Failure Is Not An Error)。

應用例子:

SFINAE :關于is_class,is_base_of,C++編譯器的魔法器,如何實現,is_class,is_base_of。_c++ is class-CSDN博客

C++ SFINAE (Substitution Failure Is Not An Error)

SFINAE 是 C++ 模板元編程中的一個重要原則,它允許編譯器在模板參數推導和重載解析過程中優雅地處理某些類型的錯誤。

基本概念

SFINAE 原則表明:在模板參數推導過程中,如果某個模板實例化導致無效代碼,這不會被視為編譯錯誤,而只是簡單地從候選函數集中移除該模板。

工作原理

  1. 當編譯器嘗試匹配函數調用時,會考慮所有可能的重載

  2. 對于模板函數,編譯器會嘗試用實際參數類型替換模板參數

  3. 如果替換導致無效類型或表達式,該模板特化會被靜默忽略

  4. 只要有至少一個有效的匹配,編譯就會繼續

常見應用場景

1. 類型特征檢查

template<typename T>
class has_foo {typedef char yes[1];typedef char no[2];template<typename C> static yes& test(decltype(&C::foo));template<typename C> static no& test(...);public:static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

2. 基于條件啟用/禁用函數重載

template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
process(T value) {// 處理整數類型
}template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
process(T value) {// 處理浮點類型
}

3. 防止特定類型的實例化

template<typename T>
void print(const T& value) {static_assert(!std::is_pointer<T>::value, "Pointers not allowed");std::cout << value;
}

C++11/14/17 的改進

  1. std::enable_if?- 更簡潔的條件啟用

  2. std::void_t?- 簡化類型特征檢查

  3. if constexpr?(C++17) - 替代部分 SFINAE 用例

  4. Concepts (C++20) - 更強大的替代方案

注意事項

  1. SFINAE 只適用于直接上下文中的失敗

  2. 過度使用 SFINAE 可能導致代碼難以理解和維護

  3. C++20 的 Concepts 提供了更清晰的方式來表達類似的約束

SFINAE 是 C++ 模板元編程的強大工具,但應謹慎使用,特別是在現代 C++ 中可能有更簡潔的替代方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86000.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ollama客戶端 + Docker搭建本地知識庫(Mac系統)

一、環境準備 1. 安裝Ollama客戶端 官網下載&#xff1a;https://ollama.com 驗證安裝&#xff1a; ollama --version2. 安裝Docker Desktop 下載地址&#xff1a;https://www.docker.com/products/docker-desktop 安裝后確保Docker狀態為"Running" 二、基礎搭建…

FastMCP 2.9 版本詳解:MCP 原生中間件與類型轉換增強

下面我將從三個方面來講解這個&#xff0c;第一是講解2.9版本的更新&#xff0c;第二是講解什么將手動解析底層JSON-RPC 消息&#xff0c;丟失 FastMCP 高層語義&#xff0c;第三是講一講&#xff0c;什么叫做中間件。不了解的兄弟們系好安全帶&#xff0c;我們準備發車了&…

LTspice仿真6——PWL折線波產生

1.自定義波形 2.自定義波形周期 3.以文件.txt的形式定義折線波 4.通過C語言編程&#xff0c;一系列操作&#xff0c;生成自定義正弦波&#xff08;可自定義性強&#xff09;

FunASR搭建語音識別服務和VAD檢測

調整VAD參數 1. 查找VAD模型的配置文件 FunASR中的VAD模型為FSMN-VAD&#xff0c;參數配置類為VADXOptions&#xff0c;可以在以下路徑中找到&#xff1a; /workspace/FunASR/runtime/python/onnxruntime/funasr_onnx/utils/e2e_vad.py 其中&#xff0c;VADXOptions類定義了…

多模態大模型(從0到1)

文章目錄 一、多模態大模型二、常見模態組合 典型應用場景三、多模態&#xff08;模型 框架&#xff09;1. 多模態模型2. 多模態框架 —— 開源項目推薦&#xff08;可快速上手&#xff09; 四、入門與學習路線1. 理論基礎2. 主流多模態模型實戰3. 進階與應用拓展&#x1f4d…

# Vue.js 精確輪播組件實現詳解

## &#x1f4d6; 概述 本文詳細介紹了一個基于 Vue.js 開發的高精度輪播組件&#xff0c;該組件實現了精確的卡片對齊和平滑滾動效果。組件支持混合布局&#xff08;大卡片網格布局&#xff09;&#xff0c;具備智能位置計算和精確滾動控制功能。 ## ? 組件特點 ### &#x1…

將RESP.app的備份數據轉碼成AnotherRedisDesktopManager的格式

將RESP.app的備份數據轉碼成AnotherRedisDesktopManager的格式 最近發現了AnotherRedisDesktopManager&#xff0c;這個軟件可以直接展示proto數據。 將RESP.app導出的json文件&#xff0c;轉碼為AnotherRedisDesktopManager的ano文件&#xff08;是一個list轉了base64&#xf…

前端基礎知識JavaScript系列 - 09(JavaScript原型,原型鏈 )

一、原型 JavaScript 常被描述為一種基于原型的語言——每個對象擁有一個原型對象 當試圖訪問一個對象的屬性時&#xff0c;它不僅僅在該對象上搜尋&#xff0c;還會搜尋該對象的原型&#xff0c;以及該對象的原型的原型&#xff0c;依次層層向上搜索&#xff0c;直到找到一個…

vue3+ts 使用VueCropper實現剪切圖片

效果圖&#xff1a; 參考文檔&#xff1a; Vue-Cropper 文檔Vue-Cropper 文檔 安裝VueCropper //npm安裝 npm install vue-croppernext -d --save//yarn安裝 yarn add vue-croppernext 引入組件 在main.ts中全局注冊&#xff1a; import VueCropper from vue-cropper; i…

el-table特殊表頭樣式

el-table特殊表頭樣式 實現表頭是按鈕 <el-table-column align"center"><template slot"header"><el-buttonsize"mini"type"primary"icon"el-icon-plus"circleclick"addData"></el-button&g…

el-tree的屬性render-content自定義樣式不生效

需求是想要自定義展示el-tree的項&#xff0c;官網有一個:render-content屬性&#xff0c;用的時候發現不管是使用class還是style&#xff0c;樣式都沒有生效&#xff0c;還會報一個錯&#xff0c;怎么個事呢&#xff0c;后來發現控制臺還會報一個錯“vue.js:5129 [Vue warn]: …

銀杏書簽里的春天

春末的細雨沾濕了舊書扉頁&#xff0c;我在泛黃的《飛鳥集》里發現那枚銀杏書簽時&#xff0c;窗外的梧桐樹正抖落最后一片枯葉。深褐色的葉脈間夾著張字條&#xff0c;娟秀的字跡被歲月暈染&#xff1a;"給永遠在奔跑的人。" 十年前的我在舊書店打工&#xff0c;每天…

spring-ai 1.0.0 學習(十四)——向量數據庫

向量數據庫是AI系統中常用的工具&#xff0c;主要用來存儲文檔片段及進行語義相似度查找 與傳統數據庫不同&#xff0c;它執行的是相似度查找而不是精確匹配 最小化樣例 首先在application.properties中&#xff0c;根據所用Embedding模型&#xff0c;添加一個嵌入式模型型號…

Spring Boot 的Banner的介紹和設置

Spring Banner 是指在 Spring Boot 應用啟動時,控制臺上顯示的那一段 ASCII 藝術字(通常是 Spring 的 logo),以及一些應用信息。 Banner 是 Spring Boot 提供的一個小但有趣的功能,可以讓應用程序啟動時更具個性也顯得更高級。 默認 Banner Spring Boot 內置了一個默認…

魅族“換血”出牌:手機基本盤站不穩,想靠AI和汽車“改命”

撰稿|何威 來源|貝多財經 被吉利收購后&#xff0c;魅族逐漸轉向在AI領域躬身耕作。 自2024年2月以“All in AI”正式宣告轉型、喊出不再推出傳統智能手機的豪言開始&#xff0c;這家曾以設計見長的手機廠商&#xff0c;將下半場押注在AI終端、AR眼鏡與智能座艙系統上&#…

力扣熱題100之將有序數組轉換為二叉搜索樹

題目 給你一個整數數組 nums &#xff0c;其中元素已經按 升序 排列&#xff0c;請你將其轉換為一棵 平衡 二叉搜索樹。 代碼 使用遞歸的方法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # s…

mac隱藏文件現身快捷鍵

在 macOS 系統中&#xff0c;?顯示/隱藏隱藏文件? 有兩種常用方法&#xff0c;以下是詳細說明&#xff1a; ? 方法一&#xff1a;使用快捷鍵&#xff08;最簡單&#xff09; 打開 ?訪達&#xff08;Finder&#xff09;?。 進入任意文件夾&#xff08;如桌面或文檔&#x…

IAR Workspace 中 Debug 與 Release 配置的深度解析

IAR Workspace 中 Debug 與 Release 配置的深度解析 一、配置的本質區別 1. 核心目標對比 特性Debug 配置Release 配置優化目標調試友好性性能/尺寸優化代碼優化無或低優化 (-O0/-O1)高級優化 (-O2/-O3/-Oz)調試信息包含完整符號信息無或最小化符號斷言檢查啟用通常禁用輸出…

Ubuntu下安裝python3

一、下載python3源碼 以要安裝的是python3.13.5為例&#xff0c;在 Index of /ftp/python/3.13.5/ 下載Python-3.13.5.tgz&#xff1a; 將壓縮包上傳到Ubuntu系統中&#xff0c;解壓&#xff1a; tar -zxvf Python-3.13.5.tgz 二、安裝 進入解壓后的源碼目錄&#xff1a; c…

計算機基礎和Java編程的練習題

1. 計算機的核心硬件是什么&#xff1f;各自有什么用&#xff1f; 中央處理器&#xff08;CPU&#xff09;&#xff1a;負責執行程序中的指令&#xff0c;進行算術和邏輯運算&#xff0c;是計算機的“大腦”。 內存&#xff08;RAM&#xff09;&#xff1a;臨時存儲CPU正在處…