【C++】深入解析C++嵌套依賴類型與typename關鍵字

什么是嵌套依賴類型?

嵌套依賴類型(Nested Dependent Type)是指在一個模板中,一個類型名稱依賴于模板參數,并且是該模板參數內部的嵌套類型。

具體來說,當一個類型滿足以下兩個條件時,它就是嵌套依賴類型:

  1. 它嵌套在另一個類型內部(如 Container::iterator

  2. 外層類型依賴于模板參數(如 T::inner_typeContainer<T>::iterator

比如:

template <class T>
void print_list(const list<T>& l)
{typename list<T>::const_iterator it = l.begin();    // 這里 list<T> 依賴于模板參數 Twhile (it != l.end()){cout << *it << " ";++it;}cout << endl;
}

list<T>::const_iterator 就是一個嵌套依賴類型,因為:

  • const_iterator 嵌套在 list<T> 內部

  • list<T> 依賴于模板參數 T

為什么需要 typename 關鍵字?

C++ 編譯器在解析模板時,需要知道一個依賴名稱是類型還是值。由于模板可能被特化,編譯器在實例化之前無法確定依賴名稱的性質。

使用 typename 關鍵字可以明確告訴編譯器:"這個依賴名稱是一個類型"。

其他需要使用 typename 的情況

除了在函數內部聲明嵌套依賴類型的變量外,還有以下幾種情況需要使用 typename

? ? ? ? 1. 作為函數返回類型

template <class T>
typename T::value_type get_first(const T& container) {return *container.begin();
}

? ? ? ? 2. 作為函數參數類型

template <class T>
void process_element(typename T::element_type elem) {// 處理元素
}

? ? ? ? 3. 在模板中聲明成員變量類型

template <class Container>
class Wrapper {
public:typename Container::value_type first_element; // 使用 typename
};

? ? ? ? 4. 使用用模板模板參數中的嵌套類型

template <template <class> class Container, class T>
void print_size(const Container<T>& c) {typename Container<T>::size_type s = c.size(); // 使用 typenamecout << s << endl;
}

? ? ? ? 5. 在繼承中指定基類類型

template <class T>
class Derived : public typename T::BaseType { // 使用 typename// ...
};

不需要使用 typename 的情況

以下情況不需要使用 typename

? ? ? ? 1. 非依賴類型

template <class T>
void func() {std::string s; // 不需要 typename,因為 std::string 不依賴于 Tint i;         // 不需要 typename
}

? ? ? ? 2. 基類列表和成員初始化列表

template <class T>
class Derived : public T::Nested { // 這里不需要 typename
public:Derived() : T::Nested() {} // 這里也不需要 typename
};

代碼示例

#include <iostream>
#include <vector>
#include <list>
using namespace std;// 1. 函數返回類型中使用 typename
template <class Container>
typename Container::value_type get_first(const Container& c) {return *c.begin();
}// 2. 函數參數中使用 typename
template <class Container>
void print_element(typename Container::value_type elem) {cout << elem << " ";
}// 3. 類模板中使用 typename
template <class Container>
class ContainerInfo {
public:typedef typename Container::value_type value_type; // 使用 typenametypedef typename Container::iterator iterator;     // 使用 typenamestatic void print_info() {cout << "Container value_type: " << typeid(value_type).name() << endl;}
};int main() {vector<int> vec = {1, 2, 3};list<double> lst = {1.1, 2.2, 3.3};// 測試函數返回類型中的 typenamecout << "First element of vector: " << get_first(vec) << endl;cout << "First element of list: " << get_first(lst) << endl;// 測試類模板中的 typenameContainerInfo<vector<int>>::print_info();ContainerInfo<list<double>>::print_info();return 0;
}

總結

  • 嵌套依賴類型是指依賴于模板參數的嵌套類型

  • 使用 typename 關鍵字告訴編譯器某個依賴名稱是類型而不是值

  • 在函數返回類型、參數類型、變量聲明等地方都可能需要使用 typename

  • 只有在處理依賴類型時才需要使用 typename,非依賴類型不需要

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

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

相關文章

管網信息化監測主要的內容

管網信息化監測是指通過現代信息技術手段對管網系統進行實時監控和數據采集的管理方式。其背景源于城市化進程加快以及基礎設施建設規模不斷擴大&#xff0c;傳統的管網管理模式已無法滿足現代化需求。管網信息化監測主要內容包括以下幾個方面&#xff1a;█管網運行狀態監測&a…

數據泄露代價千萬,PII 保護你真的做對了嗎?

一、PII—數據隱私的核心概念解析 在大多數數據隱私法律中,可識別個人信息(PII, Personally Identifiable Information)是指任何可以用來識別個人身份的信息。然而,PII 的定義并非由單一法律統一規定,不同國家和地區的法律對其定義略有差異: 各國對 PII 的定義 美國 20…

【數據結構】八大排序之快速排序:分而治之的藝術

文章目錄快速排序1.hoare版本算法優化三數取中法小區間優化完整代碼如下算法分析時間復雜度空間復雜度2.前后指針法排序過程3.非遞歸&#xff08;棧模擬&#xff09;實現思路總結快速排序 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c;其基本思想為…

在ROS中獲取并發布UBS式傳感器的溫濕度

哈嘍大家好&#xff0c;我是鋼板獸&#xff01; 今天更新一篇和ROS相關的文章&#xff0c;有個項目需求是在ROS中獲取并發布UBS式傳感器的溫濕度&#xff0c;我使用的溫濕度傳感器簡介如下&#xff1a;DL11- MC-S1 溫濕度傳感器通過USB 接口采用標準MODBUS RTU 協議通信&#x…

【圖論】 Graph.jl 操作匯總

文章目錄圖論的集合類操作Base.getindexBase.intersectBase.joinBase.reverseBase.reverse!Base.sizeBase.sumBase.sumBase.union圖生成與轉換Graphs.cartesian_productGraphs.complementGraphs.compute_shiftsGraphs.crosspathGraphs.differenceGraphs.egonetGraphs.induced_s…

【鏈表 - LeetCode】146. LRU 緩存

146. LRU 緩存 題解&#xff1a; class LRUCache {list<pair<int,int>>v;unordered_map<int,list<pair<int,int>>::iterator>idx;int capacity; public:LRUCache(int capacity):capacity(capacity){}int get(int key) {if(idx.count(key) 0) …

Elasticsearch vs Solr vs OpenSearch:搜索引擎方案對比與索引設計最佳實踐

Elasticsearch vs Solr vs OpenSearch&#xff1a;搜索引擎方案對比與索引設計最佳實踐 隨著大數據和實時分析需求的爆發&#xff0c;搜索引擎已成為許多業務系統中的核心組件。本篇文章將從“技術方案對比分析型”角度切入&#xff0c;重點比較三大主流搜索引擎&#xff1a;El…

光頡科技)Viking)的CS25FTFR009 1225 0.009R/9mR 3W電阻介紹-華年商城

“**華年商城”**小編為您介紹&#xff1a;光頡科技&#xff08;Viking&#xff09;的CS25FTFR009 1225 0.009R/9mR 3W電阻 光頡CS25FTFR009合金電阻&#xff1a;0.009Ω/9mΩ 3W 1%精密采樣電阻 光頡科技&#xff08;Viking&#xff09;的CS25FTFR009是一款高性能的電流檢測電…

港科大開放世界長時域具身導航!LOVON:足式機器人開放詞匯目標導航

作者&#xff1a;Daojie Peng1^{1}1, Jiahang Cao1,2^{1,2}1,2, Qiang Zhang1,2^{1,2}1,2, Jun Ma1,3^{1,3}1,3單位&#xff1a;1^{1}1香港科技大學&#xff08;廣州&#xff09;&#xff0c;2^{2}2北京人形機器人創新中心&#xff0c;3^{3}3香港科技大學論文標題&#xff1a;L…

【前端教程】JavaScript 數組對象遍歷與數據展示實戰

在前端開發中&#xff0c;處理數組和對象是日常工作的基礎。無論是篇文章將通過一個具體案例&#xff0c;詳細講解如何使用JavaScript遍歷包含對象的數組&#xff0c;并將數據以清晰的格式展示在頁面上。我們會從基礎語法開始&#xff0c;逐步優化代碼&#xff0c;最終實現一個…

無重復字符的最長子串,leetCode熱題100,C++實現

題目來源&#xff1a;leetCode 3. 無重復字符的最長子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 解法 class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<…

卷積神經網絡中1×1卷積的作用

part I &#xff1a;來源part II &#xff1a;應用part III &#xff1a;作用&#xff08;降維、升維、跨通道交互、增加非線性&#xff09;part IV &#xff1a;從fully-connected layers的角度理解一、來源&#xff1a;[1312.4400] Network In Network &#xff08;如果11…

VMware設置Ubuntu虛擬機橋接模式完整教程

VMware 設置 Ubuntu 虛擬機橋接模式完整教程 下面是一個詳細的、避免出錯的 VMware Ubuntu 橋接模式設置教程&#xff0c;包含常見問題的解決方案。 準備工作 確保宿主機&#xff08;Windows 11&#xff09;已連接到網絡&#xff08;有線或無線&#xff09;確認您有管理員權限關…

淺析NVMe協議:DIF

文章目錄概述DIF數據格式盤片支持DIFFormatPILPIMSETLBAF協議命令DIF支持PRACTPRACT0PRACT1PRCHK相關參考概述 NVMe協議將DIF信息作為元數據的一部分進行攜帶。 DIF數據格式 DIF的PI由多個字段組成&#xff0c;包括&#xff1a; Guard字段&#xff1a;基于邏輯塊數據計算的C…

【觀成科技】蔓靈花User下載者加密通信分析

概述2025年5月7日&#xff0c;蔓靈花&#xff08;BITTER&#xff09;組織針對巴基斯坦電信公司工作人員發起釣魚郵件攻擊&#xff0c;投遞偽裝為安全簡報的惡意郵件&#xff0c;附件為IQY類型的Web查詢文件。該文件在用戶執行后通過HTTP協議獲取遠程CMD指令并執行&#xff0c;進…

Redis 保證數據不丟失

Redis 保證數據不丟失&#xff08;或最大限度減少丟失&#xff09;的核心是通過 持久化機制 結合 合理的配置策略 實現的。具體方案如下&#xff1a;一、核心&#xff1a;開啟 Redis 持久化&#xff08;防止進程崩潰丟失數據&#xff09;Redis 提供兩種持久化方式&#xff0c;可…

NUMA/SNC 4種組合下Stream+MLC性能對決:雙路服務器BIOS調優全攻略

關于調整 BIOS NUMA 與 SNC 選項的 Stream / MLC 性能測試總結一、測試背景與目的在現代多路 Intel Xeon 服務器上&#xff0c;NUMA&#xff08;Non-Uniform Memory Access&#xff09;與 SNC&#xff08;Sub-NUMA Clustering&#xff09;是兩項決定內存訪問延遲與帶寬的關鍵 B…

Java-113 深入淺出 MySQL 擴容全攻略:觸發條件、遷移方案與性能優化

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-31- 千呼萬喚始出來 GPT-5 發布&#xff01;“快的…

Kafka Connect + Streams 用到極致從 CDC 到流處理的一套落地方案

關鍵目標&#xff1a; 零丟失&#xff1a;端到端 Exactly Once&#xff08;Source 端事務 Streams exactly_once_v2 Sink DLQ&#xff09;。低延遲&#xff1a;Producer 端批量壓縮 Streams 緩存 合理 poll/commit 間隔。可恢復&#xff1a;Connect/Streams 的 rebootstrap…

# `std::basic_istream`總結

std::basic_istream總結 文章目錄std::basic_istream總結概述常用類型定義全局對象核心成員函數1. 格式化輸入2. 非格式化輸入3. 流定位4. 其他功能繼承的功能來自 std::basic_ios狀態檢查狀態管理來自 std::ios_base格式化標志流打開模式特點說明例子std::basic_istream全面用…