当前位置: 首页 > news >正文

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://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://www.dtcms.com/a/281416.html

相关文章:

  • 使用llama-factory进行qwen3模型微调
  • 2025 XYD Summer Camp 7.14 模考
  • 理解TCP如何稳定、高效地 工作在网络上的关键
  • PyTorch笔记6----------神经网络案例
  • esp32使用ESP-IDF在Linux下的升级步骤,和遇到的坑Traceback (most recent call last):,及解决
  • uniapp打包成 apk
  • 网络编程-epoll模型/udp通信
  • 在线知识付费市场:崛起态势与未来潜能​
  • 从输入网址到获取页面的过程
  • Redis主从同步原理(全量复制、增量复制)
  • 【STM32项目】植物养护设计
  • Zabbix钉钉告警
  • 线性代数小述(三)
  • 乐观锁和悲观锁
  • 【好盈电调】使用 ESP32 的 PWM 驱动无刷电调,电调型号:XRotor Pro 80A BLDC V4.1
  • PBI(产品基本信息)系统如何构建
  • 【stm32】新建工程
  • 知识付费小程序资质全解析
  • 【CMake】使用 CMake 将多模块 C 项目构建为库并链接主程序
  • Spring MVC2
  • React 手动实现页面锚点导航
  • AI Agent 框架LangChain概述
  • 【MCU控制 初级手札】1.1 电阻
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • 自注意力机制:让 AI 像人类一样「读懂」上下文
  • 明远智睿SSD2351:开启嵌入式系统开发新时代
  • WebApplicationType.REACTIVE 的webSocket
  • dotnet命令详解
  • linux的数据库与web服务器
  • LSTM入门案例(时间序列预测)