news 2026/5/6 18:26:52

C++ 模板编程详解:从基础到元编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 模板编程详解:从基础到元编程
显式指定类型

代码语言:javascript

AI代码解释

cpp复制编辑max_value<double>(3, 5); // 显式要求用 double

三、类模板

3.1 基本用法

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T> class Box { T value; public: Box(T val) : value(val) {} T get() const { return value; } };

使用方式:

代码语言:javascript

AI代码解释

cpp复制编辑Box<int> b1(10); Box<std::string> b2("Hello");

四、模板的高级特性

4.1 多个模板参数

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T, typename U> class Pair { public: T first; U second; };
4.2 模板默认参数

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T = int> class MyContainer { T data; };
4.3 模板函数重载与 SFINAE

SFINAE(Substitution Failure Is Not An Error)用于控制模板重载选择:

代码语言:javascript

AI代码解释

cpp复制编辑template<typename T> auto print(T t) -> decltype(t.begin(), void()) { std::cout << "Range type\n"; } template<typename T> void print(T t) { std::cout << "Value type\n"; }

五、模板特化与偏特化

5.1 全特化

代码语言:javascript

AI代码解释

cpp复制编辑template <> class Box<bool> { public: void info() { std::cout << "Specialized for bool\n"; } };
5.2 偏特化

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T> class Wrapper<T*> { public: void print() { std::cout << "Pointer type\n"; } };

偏特化在处理指针、数组、const 类型等非常有用。


六、模板实例化与编译机制

模板是在编译期间根据使用方式实例化的。

示例:

代码语言:javascript

AI代码解释

cpp复制编辑Box<int> b1(1); // 编译器生成 Box<int> Box<double> b2(2.3); // 另一个版本 Box<double>

注意:模板定义必须在头文件中,否则无法多处引用(因为实例化依赖定义)。


七、模板元编程(Template Metaprogramming)

模板元编程是一种在编译期进行计算和逻辑判断的技术。它允许构建静态递归、类型选择器、条件逻辑等。

7.1 编译期阶乘

代码语言:javascript

AI代码解释

cpp复制编辑template <int N> struct Factorial { static const int value = N * Factorial<N - 1>::value; }; template <> struct Factorial<0> { static const int value = 1; }; // 使用 int x = Factorial<5>::value; // 120
7.2 类型萃取(Type Traits)

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T> struct is_pointer { static const bool value = false; }; template <typename T> struct is_pointer<T*> { static const bool value = true; };

C++11 提供标准类型萃取头<type_traits>,如:

代码语言:javascript

AI代码解释

cpp复制编辑std::is_same<int, int>::value // true std::is_pointer<int*>::value // true

八、可变参数模板(Variadic Templates)

C++11 起支持不定参数模板:

代码语言:javascript

AI代码解释

cpp复制编辑template <typename T, typename... Args> void print_all(T first, Args... rest) { std::cout << first << "\n"; print_all(rest...); } void print_all() {} // 递归终止条件

用于构建灵活的接口,如std::tuple,std::make_shared背后的技术。


九、折叠表达式(C++17)

C++17 引入“折叠表达式”简化可变参数操作:

代码语言:javascript

AI代码解释

cpp复制编辑template<typename... Args> auto sum(Args... args) { return (... + args); // 折叠为 args1 + args2 + ... }

十、模板与 STL 设计

STL 库几乎完全基于模板构建:

  • std::vector<T>:模板类
  • std::sort<Iterator>:模板函数
  • std::enable_if:模板条件选择器

正因为模板,STL 实现了“零运行时开销”的泛型编程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 18:24:04

AI辅助设计:核心工具与实践指南

设计行业正在经历一场由人工智能驱动的深刻变革。传统设计流程中反复修改、素材难寻、效率受限等问题&#xff0c;在AI技术的介入下正在得到系统性解决。从海报生成到智能抠图&#xff0c;从配色推荐到版式优化&#xff0c;AI辅助设计工具已经渗透到商业视觉创作的各个环节。以…

作者头像 李华
网站建设 2026/5/6 18:24:02

Faust音频编程:函数式DSP语言如何革新音频插件开发

1. 从零开始认识Faust&#xff1a;音频编程的“函数式”革命如果你和我一样&#xff0c;在音频信号处理&#xff08;DSP&#xff09;和插件开发的领域里摸爬滚打过一段时间&#xff0c;那你一定经历过这样的场景&#xff1a;为了把一个精巧的算法想法变成能在DAW里跑起来的VST插…

作者头像 李华
网站建设 2026/5/6 18:23:10

从STM32F4到H750移植SPI屏,除了时钟别忘了检查这个HAL库新增的配置项

从STM32F4到H750移植SPI屏&#xff1a;HAL库新增配置项的深度解析与实战避坑指南 当开发者从STM32F4系列迁移到H750时&#xff0c;往往会遇到一个有趣的现象&#xff1a;代码看似顺利运行&#xff0c;却在压力测试中暴露各种诡异问题。最近一位工程师在H750核心板上驱动正点原子…

作者头像 李华