跳到主要内容

模板与泛型编程

模板是 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::vectorstd::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::tuplestd::make_shared。递归展开是经典手法,C++17 的「折叠表达式」让求和、求积这类操作更简洁。

template <typename... Args>
auto sum(Args... args) {
return (args + ... + 0); // 折叠表达式
}

模板元编程简介

模板元编程(TMP)在编译期执行计算,典型应用包括编译期阶乘、std::enable_ifstd::conditional。C++20 的 conceptrequires 表达式让约束类型能力更直观,大幅减少 SFINAE 技巧。