模板与泛型编程
模板是 C++ 泛型编程的基石,允许把类型作为参数编写与类型无关的代码。模板的实例化在编译期完成,因此不会带来运行时代价。
函数模板
template<typename T> 声明一个类型参数,函数体对任意满足要求的类型生效。调用时编译器根据实参推断 T,这一过程称为模板实参推导。
template <typename T>
T my_max(T a, T b) {
return (a < b) ? b : a;
}
int m = my_max(3, 7);
double d = my_max(1.5, 2.5);
C++20 起可使用简写 template<T concept_name T> 配合概念约束。
类模板
类模板把类型作为类的参数,标准库的 std::vector、std::map 都是类模板。类外实现成员函数时仍需带模板头。
template <typename T>
class Box {
T value;
public:
explicit Box(T v) : value(v) {}
T get() const { return value; }
};
Box<int> bi(42);
类模板可有默认模板参数:template<class T = int> class Box {};。
模板特化
特化允许为特定类型提供不同实现,常见的有「全特化」(指定所有参数)与「偏特化」(指定部分参数或约束关系)。
template <>
class Box<const char*> { /* 字符串特化版本 */ };
可变参数模板
C++11 起支持任意数量的模板参数,常用于实现 std::tuple、std::make_shared。递归展开是经典手法,C++17 的「折叠表达式」让求和、求积这类操作更简洁。
template <typename... Args>
auto sum(Args... args) {
return (args + ... + 0); // 折叠表达式
}
模板元编程简介
模板元编程(TMP)在编译期执行计算,典型应用包括编译期阶乘、std::enable_if、std::conditional。C++20 的 concept 与 requires 表达式让约束类型能力更直观,大幅减少 SFINAE 技巧。