C++ 模板參數展開

C++ 模板參數展開

  • 一、獲取可變參數大小
  • 二、通過模版循環繼承的方式來展開可變參數
  • 三、改用Using去實現循環繼承


一、獲取可變參數大小

背景:
FLen<int, char, long> Len;
我想要獲取模板參數類型的總大小

template<typename T,typename ...ParamTypes>
class FLen
{
public:enum{Number = FLen<T>::Number + FLen<ParamTypes...>::Number};
};template<typename Last>
class FLen<Last>
{
public:enum{Number = sizeof(Last)};
};

思想還是類似遞歸調用的思想,只是遞歸的不是函數而是模板

int main()
{FLen<int, char, long> Len;std::cout << Len.Number << std::endl;system("pause");return 0;
}

二、通過模版循環繼承的方式來展開可變參數

最終目的是構建一個 TestIndex 類型,其模板參數是從0開始到N-1的整數序列。

template<int...>
struct TestIndex
{};template<int N,int...ParamTypes>
struct FSpawnIndex : FSpawnIndex<N - 1,N - 1,ParamTypes...>
{};template<int...ParamTypes>
struct FSpawnIndex<0,ParamTypes...>
{typedef TestIndex<ParamTypes...> Type;
};

解釋一下原理和流程
起始:FSpawnIndex<3>(此時 N=3,參數包為空)
繼承:FSpawnIndex<3> : FSpawnIndex<2,2>
在內部,參數包變為 2
下一步:FSpawnIndex<2,2> : FSpawnIndex<1,1,2>
參數包變為 1,2(注意:每次遞歸在參數包頭部添加)
下一步:FSpawnIndex<1,1,2> : FSpawnIndex<0,0,1,2>
參數包變為 0,1,2
匹配終止條件:FSpawnIndex<0,0,1,2>
定義 Type 為 TestIndex<0,1,2>

int main()
{using TestType = FSpawnIndex<3>::Type;std::cout << typeid(TestType).name() << std::endl;system("pause");return 0;
}

三、改用Using去實現循環繼承

template<int...>
struct TestIndex
{};template<int N,int...ParamTypes>
struct FSpawnIndex
{using Type = typename FSpawnIndex<N - 1, N - 1, ParamTypes...>::Type;//          ↑↑↑↑↑// 這個 typename 必不可少!
};template<int...ParamTypes>
struct FSpawnIndex<0, ParamTypes...>
{typedef TestIndex<ParamTypes...> Type;
};

在 C++ 模板元編程中,typename 關鍵字在這里起著??關鍵作用??,主要用于解決??依賴名稱的解析問題??。

int main()
{using TestType = FSpawnIndex<3>::Type;std::cout << typeid(TestType).name() << std::endl;system("pause");return 0;
}

??什么是依賴名稱???
FSpawnIndex<N-1, …>::Type 是??依賴于模板參數 N 和 ParamTypes… 的名稱??
編譯器在解析模板時,無法確定 ::Type 是什么(可能是類型、靜態成員或嵌套模板)

例如以下例子

// 情況分析:
struct FSpawnIndex</*...*/> {// 可能1:Type 是類型(typedef/using)typedef ... Type;// 可能2:Type 是靜態成員static int Type;// 可能3:Type 是嵌套模板template<...> class Type;
};

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

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

相關文章

零基礎入門物聯網-遠程門禁開關:云平臺創建

一、 onenet云平臺注冊創建 遠程開關的信息傳輸依賴云平臺&#xff0c;本教程以 OneNET - 中國移動物聯網開放平臺為例進行操作&#xff0c;具體步驟如下&#xff1a; 1、平臺賬號創建 點擊 OneNET - 中國移動物聯網開放平臺進入官網 點擊頁面中的 “登錄” 按鈕&#xff0c;…

html頁面,當鼠標移開A字標就隱藏顏色框

html頁面代碼&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>顏色選擇器</title><style>body {font-family: "Microsoft YaHei", sans-serif;padding: 20px;}.c…

保姆級搭建harbor私有倉庫與docker-ce教程與使用教程

搭建harbor倉庫[rootharbor ~]# vim cat /etc/host192.168.121.12 harbor[rootharbor ~]# vim /etc/hostnameharbor導入 harbor 項目鏡像[rootharbor ~]# tar -zxf harbor-v2.9.2.tgz -C /usr/local/[rootharbor ~]# cd /usr/local/harbor[rootharbor harbor]# docker load -i…

【Linux】Rocky Linux 安裝 Docker 與 Docker-Compose

Docker 安裝步驟 1. 安裝必要的軟件包 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2. 安裝Docker sudo yum install docker-ce docker-ce-cli containerd.io如果出現 SSL 證書錯誤&#xf…

揭示獨特模式:Elasticsearch 中 significant terms 聚合指南

作者&#xff1a;來自 Elastic Alexander Dvila 了解如何使用 significant terms 聚合來發現你數據中的洞察。 更多閱讀&#xff1a;Elasticsearch&#xff1a;significant terms aggregation Elasticsearch 擁有大量新功能&#xff0c;可以幫助你為你的使用場景構建最佳搜索解…

pandas.DataFrame中axis參數

明確axis0與axis1的區別和聯系&#xff0c; 假設有一個 DataFrame&#xff1a;indexAB012134axis0&#xff08;沿行方向&#xff09;&#xff1a; 操作會垂直向下進行&#xff0c;對每一列單獨處理。 例如&#xff1a;df.sum(axis0) 會對列 A 和列 B 分別求和&#xff0c;結果是…

深度學習 最簡單的神經網絡 線性回歸網絡

用最簡單的線性模型講清 神經網絡 訓練全流程,讓你 5 分鐘看懂AI 是怎么學會預測的 ?? 1 真實神經元結構 ?? 真實神經元包括: 樹突 接收其他神經元傳來的電信號(輸入)。 細胞核 負責整合輸入信號并產生動作電位。 軸突 傳導動作電位到下一個神經元。 突觸 釋放神經遞質…

k8s Mutating Admission Webhook 實現超賣

目錄 1.什么是 Mutating Admission Webhook&#xff1f; 2.如何用 Mutating Admission Webhook 實現超賣&#xff1f; 3.實現超賣 3.1 理解目標 3.2 前置準備 3.3 開發 Mutating Webhook 3.4 配置 Webhook Server TLS 認證 3.5 注冊 MutatingWebhookConfiguration 3.6…

為 Go-llm-cpp 接入 Web API 接口,創建 Chatbot 聊天機器人

接續上一篇&#xff0c;用 Go 打造本地 LLM 聊天機器人&#xff1a;整合 llm-go 與 go-llama.cpp&#xff0c;此篇開始建構前端與 API 接口 執行環境需求 ? ? Go 1.20 ? ? C toolchain&#xff08;macOS: Xcode Command Line Tools / Linux: g&#xff09; ? ? GGUF 格式…

Docker筆記-Docker Compose

Docker筆記-Docker Compose Compose 是用于定義和運行多容器 Docker 應用程序的工具&#xff0c;通過 Compose 您可以使用 YML 文件來配置應用 程序需要的所有服務。然后&#xff0c;使用一個命令&#xff0c;就可以從 YML 文件配置中創建并啟動所有服務。 Compose 使用的三個步…

n1 armbian 安裝桌面環境并啟用xrdp遠程登錄

armbian-config armbian-software201frpcrootarmbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: ubuntu/noble ]... ──────────────────────────────────────────────────────────…

從傳統到智能:地質災害風險評估、易發性分析與災后重建;AI大語言模型DeepSeek、ChatGPT、GIS、Python和機器學習深度融合

地質災害是指全球地殼自然地質演化過程中&#xff0c;由于地球內動力、外動力或者人為地質動力作用下導致的自然地質和人類的自然災害突發事件。在降水、地震等自然誘因的作用下&#xff0c;地質災害在全球范圍內頻繁發生。我國不僅常見滑坡災害&#xff0c;還包括崩塌、泥石流…

便捷的電腦自動關機輔助工具

軟件介紹 本文介紹的軟件是一款電腦上實用的倒計時和關機助手。 軟件特性 這款關機助手十分貼心&#xff0c;它是一款無需安裝的小軟件&#xff0c;體積僅60KB&#xff0c;不用擔心占用電腦空間&#xff0c;打開即可直接使用。 操作方法 你只需設置好對應的關機時間&#x…

Fiddler-關于抓取Android手機包,安裝證書后頁面加載失敗,提示當前證書不可信存在安全風險的問題

Fiddler-關于抓取Android手機包&#xff0c;安裝證書后頁面加載失敗&#xff0c;提示當前證書不可信存在安全風險的問題Fiddler-關于抓取Android手機包&#xff0c;安裝證書后頁面加載失敗&#xff0c;提示當前證書不可信存在安全風險的問題原因解決方法Fiddler-關于抓取Androi…

Apache Spark 4.0:將大數據分析提升到新的水平

Apache Spark 4.0 帶來了 PySpark 畫圖、多態 UDTF、改進的 SQL 腳本和 Python API 更新&#xff0c;以增強實時分析和可用性。 Apache Spark 4.0 于 2025 年發布&#xff0c;它通過增強性能、可訪問性和開發者生產力的創新&#xff0c;重新定義了大數據處理。在 Databricks、A…

手機解壓軟件 7z:高效便捷的解壓縮利器

在當今數字化時代&#xff0c;手機已經成為人們生活和工作中不可或缺的工具。隨著文件傳輸和存儲需求的不斷增加&#xff0c;7z 文件格式因其高效的壓縮比而備受青睞。在手機上處理 7z 文件變得越來越重要&#xff0c;合適的解壓軟件能帶來諸多便利。首先&#xff0c;7z 文件格…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第六課——測試圖案的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

Solidity——修改狀態變量注意事項和簡單優化建議

你的問題非常關鍵&#xff0c;涉及到 Solidity 合約部署時的初始化 gas 成本 和 運行時的存儲操作 gas 消耗。我們來詳細解答&#xff1a; &#x1f6a8; 首先&#xff0c;你的代碼是非法的&#xff1a; contract MyContract {uint public myNumber;myNumber 1; // ? 不允許…

2023年全國青少年信息素養大賽Python編程小學組復賽真題+答案解析-海南賽區

2023年全國青少年信息素養大賽Python編程小學組復賽真題+答案解析-海南賽區 編程題 第1題 整數加8 題目描述 輸入一個整數,輸出這個整數加8的結果。 輸入描述 輸入一行一個正整數。 輸出描述 輸出求和的結果。 樣例1 輸入: 5 輸出: 13 題目解析 這是最基礎的輸入輸出與…

Qt基本組件詳解:按鈕、輸入框與容器控件

Qt基本組件詳解&#xff1a;按鈕、輸入框與容器控件目錄 按鈕類組件 QPushButtonQRadioButtonQCheckBox 輸入框組件 QLineEditQTextEdit 容器組件 QGroupBox 綜合應用示例思維導圖總結1. 按鈕類組件 1.1 QPushButton&#xff08;普通按鈕&#xff09; 功能&#xff1a;基礎交互…