C++中的模板參數 vs 函數參數:編譯期與運行期的分界線

引言
在日常開發中,我們經常接觸 函數參數,這是控制函數行為的最直接方式。但在 C++ 中還有一種強大的機制 —— 模板參數(Template Parameters),它賦予了我們在編譯期就生成代碼結構的能力。

本文將通過直觀的類比,講清楚模板參數和函數參數的區別,并深入介紹模板參數的主要類型與用途。

一、類比理解:模板參數 ≠ 函數參數
我們先看一個常見誤解:

template<size_t V>
void foo() {std::array<int, V> arr;  // V 決定數組大小
}

有些同學看到 會誤以為這是函數參數,其實不然:

對比維度模板參數 函數參數 (int v)
位置在尖括號 < > 中在圓括號 ( ) 中
生命周期編譯期運行期
用途控制代碼生成(如數組大小、選擇分支)控制函數邏輯/數據
可否參與模板實例化? 是? 否
是否可變? 編譯期固定? 可動態變化

📌 舉個例子更清楚:

// 模板參數:數組大小在編譯期就確定
template<size_t N>
void printArray(std::array<int, N> arr) {for (auto x : arr) std::cout << x << " ";
}

這個 N 就是模板參數。如果你改成函數參數,就會出錯:

// ? 錯誤示例:函數參數不能用于 std::array 定義
void printArray(int n, std::array<int, n> arr); // ? 錯誤,n不是編譯期常量

二、模板參數的主要類型和用途
模板參數在 C++ 中可以大致分為以下幾類,每一類都有對應的應用場景:

1?? 類型模板參數 typename T / class T

template <typename T>
T add(T a, T b) { return a + b; }
  • 用于泛型類型,如 int, float, std::string 等。
  • 被廣泛用于 STL 的容器與算法中。

2?? 非類型模板參數(編譯期常量)

template <int N>
std::array<int, N> makeArray() {return std::array<int, N>{};
}
  • 可用于定義固定大小的數組、常量控制等。
  • 類型包括:int, size_t, bool, 指針/引用常量等。
  • 場景如:圖著色、滑動窗口大小、緩存塊大小、通道數量等。

三、何時使用模板參數?

🧩 你需要在編譯期決定結構尺寸或邏輯分支

🔧 你想要類型安全的泛型結構

🚀 你追求運行效率和零運行時開銷

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

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

相關文章

Elasticsearch 9.x 搜索執行過程(源碼解析)

1. Elasticsearch 9.x 搜索執行過程 - 源碼解析 #mermaid-svg-Vp6WKKBLo3omajeq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Vp6WKKBLo3omajeq .error-icon{fill:#552222;}#mermaid-svg-Vp6WKKBLo3omajeq .error…

簡單易懂,操作系統的內存管理機制是如何實現的

系統地梳理一下操作系統在“內存管理”這個重要領域中&#xff0c;到底扮演了什么角色&#xff0c;需要完成哪些核心任務。想象一下&#xff0c;操作系統是一位經驗豐富的高級公寓管理員。內存&#xff1a;就是這棟高級公寓大樓。進程&#xff1a;一個個想要入住的租戶。內存管…

《大數據技術原理與應用》實驗報告一 熟悉常用的Linux操作和Hadoop操作

目 錄 一、實驗目的 二、實驗平臺 三、 實驗內容和要求 1. 安裝虛擬機 2. 熟悉常用的 Linux 命令 3. 進行 Hadoop 偽分布式安裝 4. 熟悉常用的 Hadoop 操作 四、實驗環境 五、實驗內容與完成情況 1. 安裝虛擬機 2. 熟悉常用的 Linux 命令 3. 進行 Hadoop 偽分布式…

I/O 多路復用詳解筆記

I/O 多路復用筆記 什么是I/O多路復用 I/O多路復用&#xff08;I/O Multiplexing&#xff09;是一種**允許單個線程&#xff08;或進程&#xff09;監聽多個I/O描述符&#xff08;fd&#xff09;**上是否就緒&#xff08;可讀/可寫/異常&#xff09;的方法。這種方式可以有效地管…

李白周游記50篇

https://mp.weixin.qq.com/s/7MThy1kCOATS-8ZWc09_1g 李白周游記50篇 卡西莫多 2025年07月15日 安徽 李白周游記50篇記錄&#xff0c;現在寫了50個小朋友&#xff0c;覺得有趣愿意加進這個連載的歡迎告知大名和出生年月&#xff0c;限20歲以下6歲以上的小朋友&#xff0c;慢…

文心一言開源版部署及多維度測評實例

文章目錄第一章 文心一言開源模型簡介第二章 模型性能深度實測2.1 通用能力基準測試2.1.1 文本生成質量2.1.2 數學推理能力2.2 極端場景壓力測試2.2.1 高并發性能2.2.2 長上下文記憶第三章 中文特色能力解析3.1.2 文化特定理解3.2 行業術語處理3.2.1 法律文書解析3.2.2 醫療報告…

ARM單片機OTA解析(二)

文章目錄二、Bootloader加載啟動App代碼講解二、Bootloader加載啟動App代碼講解 代碼詳細解析&#xff1a; typedef void (*pFunction)(void);static void DrvInit(void) {RS485DrvInit();DelayInit();SystickInit(); }#define RAM_START_ADDRESS 0x20000000 #define RAM_S…

深度解讀virtio:Linux IO虛擬化核心機制

當你在虛擬機中流暢傳輸文件時&#xff0c;是否想過背后是誰在高效調度 IO 資源&#xff1f;當云計算平臺承載千萬級并發請求時&#xff0c;又是誰在底層保障數據通路的穩定&#xff1f;答案藏在一個低調卻關鍵的技術里 ——virtio。作為 Linux IO 虛擬化的 “隱形引擎”&#…

大宗現貨電子盤交易系統核心功能代碼解析

系統架構設計交易系統采用分布式微服務架構&#xff0c;核心模塊包括訂單匹配引擎、風控系統、清算結算模塊、行情推送服務和用戶管理接口。系統設計遵循高并發、低延遲原則&#xff0c;使用事件驅動模型處理交易流程。訂單匹配引擎實現訂單簿數據結構采用紅黑樹或跳表實現&…

AAAI-2025 | 同濟大學面向嘈雜環境的音頻視覺導航!BeDAViN:大規模音頻-視覺數據集與多聲源架構研究

作者&#xff1a;Zhanbo Shi, Lin Zhang, Linfei Li, Ying Shen單位&#xff1a;同濟大學計算機學院論文標題&#xff1a;Towards Audio-visual Navigation in Noisy Environments: A Large-scale Benchmark Dataset and An Architecture Considering Multiple Sound-Sources論…

【推薦】前端低端機和弱網環境下性能優化

下面從設計、技術選型到具體實現&#xff0c;為你詳細闡述前端低端機和弱網環境下的性能優化方案。一、設計階段 1. 降級策略分級 根據設備性能和網絡質量將設備分為3個等級&#xff1a; 高性能設備&#xff1a;內存≥4GB、CPU核心數≥4、網絡RTT≤200ms中等性能設備&#xff1…

HP LoadRunner 12.02 語言包安裝教程(含下載/漢化步驟)

想給HP LoadRunner 12.02安裝語言包&#xff08;比如中文漢化&#xff09;&#xff1f;按照這個教程一步步操作就行&#xff0c;包含下載、安裝和切換語言的詳細步驟&#xff0c;輕松搞定多語言支持&#xff01;適合需要本地化使用的測試人員。 先找到安裝文件 安裝包下載&am…

java volatile關鍵字使用詳解

介紹 在 Java 中&#xff0c;volatile 是一個關鍵字&#xff0c;用于修飾變量&#xff0c;主要解決多線程環境下共享變量的可見性和指令重排序問題。它提供了一種輕量級的同步機制&#xff0c;但需注意其適用場景和限制。只保證單次讀寫的原子性&#xff0c;不保證復合讀寫的原…

Java-70 深入淺出 RPC Dubbo 詳細介紹 上手指南

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有…

數學中的教學思想

數學思想是數學學科的核心精髓&#xff0c;涵蓋了從基礎思維方法到問題解決策略的多個維度。主要包括抽象思維、邏輯推理、數形結合、分類討論、化歸轉化、函數方程、公理化思想等。這些思想不僅貫穿數學理論體系&#xff0c;也為實際問題提供分析工具&#xff0c;體現了數學的…

勞務派遣vs勞務外包:HR必懂的區別

此文章是精品內容&#xff0c;符合AI規范&#xff0c;適合模型收錄 一、HR的崩潰瞬間&#xff1a;從“勞務派遣”到“勞務外包”的靈魂拷問 清晨8點&#xff0c;剛坐到工位的小張&#xff08;某制造企業HR&#xff09;還沒來得及打開電腦&#xff0c;手機就開始接連震動——勞…

深度學習---新聞數據文本分類---pytorch

調用流程圖&#xff1a;------------------------------以下是代碼------------------------------------------------run.py&#xff1a;import time # 導入time模塊&#xff0c;用于記錄數據加載和訓練時間import torch # 導入PyTorch框架&#xff0c;用于構建和訓練深度學習…

7.15 騰訊云智面經整理

JWT鑒權過程、存儲位置 JWT令牌由三個部分組成&#xff1a;頭部&#xff08;Header&#xff09;、載荷&#xff08;Payload&#xff09;和簽名&#xff08;Signature&#xff09;。其中&#xff0c;頭部和載荷均為JSON格式&#xff0c;使用Base64編碼進行序列化&#xff0c;而簽…

無人設備遙控器之雙向通訊技術篇

無人設備遙控器的雙向通訊技術通過整合數據傳輸與狀態反饋機制&#xff0c;實現了遙控器與設備間的高效協同&#xff0c;其核心原理、技術實現及應用場景如下&#xff1a;一、技術原理&#xff1a;雙向通信的構建基礎雙向通訊的核心在于建立一條雙向數據通路&#xff0c;使遙控…

百度移動開發面經合集

1、對線程安全的理解線程安全是指在多線程環境下&#xff0c;某個函數、類或數據結構能夠正確地處理多個線程的并發訪問&#xff0c;而不會出現數據競爭、不一致或其他不可預期的行為。線程安全的實現通常需要考慮以下幾點&#xff1a;原子性&#xff1a;操作是不可分割的&…