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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;操作是不可分割的&…