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

深入解析C++非类型模板参数

目录

一、模板参数分类

二、非类型模板参数的应用

三、使用示例

四、非类型模板参数的限制

五、实际应用示例

六、非类型模板参数的默认值

1、基本语法

2、实际示例

1. 静态数组类设置默认大小

2. 使用示例

3、注意事项


一、模板参数分类

模板参数可分为两种主要类型:

  1. 类型形参出现在模板参数列表中,跟在classtypename关键字之后的参数类型名称

  2. 非类型形参使用一个常量作为类或函数模板的参数,在模板中可将该参数当作常量使用


二、非类型模板参数的应用

非类型模板参数常用于需要编译期确定值的场景,例如实现静态数组类:

template<class T, size_t N> // N是非类型模板参数
class StaticArray {
public:size_t arraysize() const {return N;}T& operator[](size_t index) {return _array[index];}const T& operator[](size_t index) const {return _array[index];}private:T _array[N]; // 利用非类型模板参数指定静态数组的大小
};

三、使用示例

int main() {StaticArray<int, 10> a1;    // 定义大小为10的整型静态数组cout << a1.arraysize() << endl; // 输出: 10StaticArray<double, 100> a2; // 定义大小为100的双精度静态数组cout << a2.arraysize() << endl; // 输出: 100return 0;
}

四、非类型模板参数的限制

  1. 允许的类型

    • 只允许使用整型家族(包括整数、字符、布尔等)

    • 指针和引用在特定情况下也允许

  2. 不允许的类型:浮点数、类对象、字符串字面量

  3. 编译期要求

    • 非类型模板参数必须在编译期就能确定结果

    • 因为编译器需要在编译阶段根据这些参数生成对应的类或函数


五、实际应用示例

标准库中的std::array就是一个使用非类型模板参数的典型例子:

namespace bite {// 定义一个模板类型的静态数组template<class T, size_t N = 10> // 默认大小为10class array {public:T& operator[](size_t index) { return _array[index]; }const T& operator[](size_t index) const { return _array[index]; }size_t size() const { return N; } // 直接返回模板参数Nbool empty() const { return N == 0; }private:T _array[N];};
}

非类型模板参数为C++模板编程提供了更多灵活性,特别是在需要编译期常量的场景中非常有用。


六、非类型模板参数的默认值

非类型模板参数可以设置默认值,这与类型模板参数设置默认值的语法规则相同。

1、基本语法

template <class T, size_t N = 默认值>  // 为非类型参数N设置默认值
class ClassName {// 类定义
};

2、实际示例

1. 静态数组类设置默认大小

template <class T, size_t N = 10>  // 默认数组大小为10
class StaticArray {
public:size_t size() const { return N; }// ... 其他成员函数
private:T _array[N];
};

2. 使用示例

int main() {StaticArray<int> a1;      // 使用默认大小10StaticArray<double, 20> a2; // 显式指定大小20cout << a1.size() << endl; // 输出: 10cout << a2.size() << endl; // 输出: 20return 0;
}

3、注意事项

  1. 默认参数规则

    • 与函数默认参数类似,从右向左设置默认值

    • 如果某个模板参数有默认值,它右边的所有参数都必须有默认值

  2. 正确示例

    template <class T = int, size_t N = 10>  // 正确
    class A {};
  3. 错误示例

    template <class T = int, size_t N>  // 错误:N没有默认值
    class B {};

这种技术广泛用于需要编译期确定大小的容器类,是模板元编程中的重要技术之一。

http://www.dtcms.com/a/343481.html

相关文章:

  • Linux入门DAY29
  • AI 产业落地:从 “实验室神话” 到 “车间烟火气” 的跨越
  • 【TrOCR】模型预训练权重各个文件解读
  • SpringAI1.0.1实战教程:避坑指南25年8月最新版
  • 近端策略优化算法PPO的核心概念和PyTorch实现详解
  • Typescript入门-函数讲解
  • 创建一个springboot starter页面
  • LG P2617 Dynamic Rankings Solution
  • 1688 商品详情接口数据全解析(1688.item_get)
  • 关于从零开始写一个TEE OS
  • 如何安装 VMware Workstation 17.5.1?超简单步骤(附安装包下载)
  • Building Systems with the ChatGPT API 使用 ChatGPT API 搭建系统(第四章学习笔记及总结)
  • 一文讲清楚:场景、痛点、需求
  • mainMem.useNamedFile = “FALSE“ 的效果
  • UE5多人MOBA+GAS 52、下载源码构建引擎
  • 如何处理项目中棘手的依赖版本冲突问题
  • 软考中级【网络工程师】第6版教材 第3章 局域网 (下)
  • 构造参数注入解决循环依赖问题
  • 射频电路的完整性简略
  • rt-thread使用sfud挂载qspi flash的trace分析
  • Linux ELF二进制文件数字签名工具:原理与设计思路(C/C++代码实现)
  • SQL聚合情景解读
  • 【笔记】Facefusion3.3.2 之 NSFW 检测屏蔽测试
  • 代码随想录算法训练营27天 | ​​56. 合并区间、738.单调递增的数字、968.监控二叉树(提高)
  • 机器学习6
  • 机器学习-聚类算法
  • 告别研发乱局,决胜项目先机——全星APQP系统,为汽车部件制造商量身打造的数字化研发管理引擎
  • GPT5 / 深度研究功能 无法触发
  • 4.Shell脚本修炼手册---变量进阶知识
  • 加速你的故障排查:使用 Elasticsearch 构建家电手册的 RAG 应用