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; // 1207.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 实现了“零运行时开销”的泛型编程。