news 2026/9/4 13:13:15

深入理解C++ 模板<六> 模板模板参数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解C++ 模板<六> 模板模板参数

模板模板参数(Template Template Parameter),简单说就是:让模板参数本身也是一个模板

通常情况下,我们传的是类型(如int)或常量值(如10)。而模板模板参数允许你传入一个类模板(如std::vectorstd::list),然后再用你的类型去实例化它。

这在你需要“容器适配”时特别有用——比如你想定义一个容器包装器,把具体的容器类型(vector/list/deque)作为参数传进去,同时把元素类型也留给用户指定。


核心语法解析

  • 声明方式:template <typename T, template <typename...> class ContainerType>

    • typename T:普通类型参数,指定元素类型。

    • template <typename...> class ContainerType模板模板参数,表示ContainerType本身是个模板(可接受任意多个类型参数)。

  • C++17之前必须用class关键字,不能用typename;C++17及之后两者都可

#include <iostream> #include <vector> #include <list> #include <string> // T: 元素类型 // ContainerType: 模板模板参数,代表一个容器模板(如 vector, list) template <typename T, template <typename...> class ContainerType> class MyWrapper { private: ContainerType<T> storage; // 使用 T 去实例化传入的容器模板 public: // 添加元素 void add(const T& value) { storage.push_back(value); } // 打印所有元素 void print() const { for (const auto& val : storage) { std::cout << val << " "; } std::cout << std::endl; } }; int main() { // 1. 使用 std::vector 作为底层容器,元素类型为 int MyWrapper<int, std::vector> vecWrapper; vecWrapper.add(10); vecWrapper.add(20); vecWrapper.add(30); std::cout << "Vector 中的内容: "; vecWrapper.print(); // 输出: 10 20 30 // 2. 使用 std::list 作为底层容器,元素类型为 std::string MyWrapper<std::string, std::list> listWrapper; listWrapper.add("Hello"); listWrapper.add("World"); std::cout << "List 中的内容: "; listWrapper.print(); // 输出: Hello World return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 13:11:57

STM32F103驱动ICM20948九轴传感器:DMP移植与姿态解算实战

简介&#xff1a;本资源是一套专为STM32F103微控制器适配ICM20948九轴传感器的完整DMP驱动库&#xff0c;面向嵌入式初学者、智能硬件开发者及运动感知类项目实践者&#xff0c;解决在Cortex-M3平台高效调用ICM20948内置数字运动处理器&#xff08;DMP&#xff09;的技术门槛问…

作者头像 李华
网站建设 2026/9/4 13:11:54

Czkawka 重复文件清理实战:零上传扫出硬盘里的 20 GB 冗余

Czkawka 重复文件清理实战&#xff1a;零上传扫出硬盘里的 20 GB 冗余 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka Czkawka 是一款用 Rust 编写…

作者头像 李华
网站建设 2026/9/4 13:10:56

Element Plus 上手指南:Vue 3 企业级组件库的 80+ 组件怎么用

Element Plus 上手指南&#xff1a;Vue 3 企业级组件库的 80 组件怎么用 【免费下载链接】element-plus &#x1f389; A Vue.js 3 UI Library made by Element team 项目地址: https://gitcode.com/GitHub_Trending/el/element-plus 做 Vue 3 后台项目&#xff0c;最耗…

作者头像 李华
网站建设 2026/9/4 13:10:54

Agno Workflow 工作流编排实战:条件分支与并行速查

Agno Workflow 工作流编排实战&#xff1a;条件分支与并行速查 【免费下载链接】agno Build, run, and manage agent platforms. 项目地址: https://gitcode.com/GitHub_Trending/ag/agno 假设一条内容要经过采集、摘要、事实核查、写作、审阅。手写 if-else 链路&#…

作者头像 李华
网站建设 2026/9/4 13:10:44

Chat2DB 选型指南:开源版还是 Pro 版,三个问题想清楚

Chat2DB 选型指南&#xff1a;开源版还是 Pro 版&#xff0c;三个问题想清楚 【免费下载链接】Chat2DB Chat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40 databases, manage…

作者头像 李华
网站建设 2026/9/4 13:10:11

iTerm2配色方案推荐指南:3步换一套护眼终端主题

iTerm2配色方案推荐指南&#xff1a;3步换一套护眼终端主题 【免费下载链接】iTerm2-Color-Schemes Over 450 terminal color schemes/themes for iTerm/iTerm2. Includes ports to Terminal, Konsole, PuTTY, Xresources, XRDB, Remmina, Termite, XFCE, Tilda, FreeBSD VT, T…

作者头像 李华