函数模板和类模板是C++泛型编程的核心,通过template定义通用函数和类,编译器在调用时根据参数类型自动推导并生成对应实例;函数模板支持类型推导与显式指定,类模板需在使用时指定具体类型,成员函数定义需带模板前缀;模板支持多参数及默认参数,如template或template;注意事项包括模板代码须置于头文件、避免分离编译导致的链接错误、成员函数按需实例化以及类型操作的隐含约束,现代C++可用concepts(C++20)显式约束模板参数以提升错误提示清晰度;掌握模板机制有助于提高代码复用性与灵活性,深入理解STL设计思想。

在C++中,模板是泛型编程的核心工具,允许我们编写与数据类型无关的通用代码。通过函数模板和类模板,可以实现适用于多种类型的函数和类,而无需重复编写相似逻辑。下面介绍如何正确实现函数模板和类模板。
函数模板的实现方法
函数模板用于定义一个通用函数,编译器会根据调用时传入的参数类型自动推导并生成对应的函数实例。
基本语法如下:
templateT max(T a, T b) {
return a > b ? a : b;
}
说明:
立即学习“C++免费学习笔记(深入)”;
-
template
声明了一个模板参数T,也可以使用 class T,两者在此场景下等价。 - 函数内部使用T作为类型,表示任意可比较的数据类型。
- 调用时如 max(3, 5) 或 max(3.14, 2.7),编译器自动推导T为int或double。
若参数类型不同,可指定模板实参:
max
类模板的实现方法
类模板用于创建通用类,比如标准库中的 vector、list 等容器都是基于类模板实现的。
定义方式:
templateclass Stack {
private:
T data[100];
int top;
public:
Stack() : top(-1) {}
void push(const T& item);
T pop();
bool empty() const;
};
成员函数可以在类外定义,但需带上模板前缀:
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
void Stack
if (top
data[++top] = item;
}
T Stack
return top >= 0 ? data[top--] : T();
}
使用时需指定类型:
Stack
intStack.push(10);
多个模板参数与默认参数
模板支持多个参数,适用于更复杂的场景:
templatestruct Pair {
T first;
U second;
};
也可设置默认模板参数:
templateclass MyContainer {
// ...
};
这样声明 MyContainer c; 会使用默认类型 int 和 vector
注意事项与常见问题
模板代码通常需要全部放在头文件中,因为编译器要在编译期看到完整定义才能实例化模板。
- 类模板的成员函数只有在被调用时才会被实例化。
- 模板不能分离编译:声明在.h,实现不能单独放在.cpp中(除非使用显式实例化)。
- 注意类型约束:模板对类型有隐含要求,例如使用了 操作符,则传入类型必须支持该操作。
现代C++可用 concepts(C++20)来显式约束模板参数类型,提升错误提示清晰度。
基本上就这些。掌握函数模板和类模板的写法,能大幅提升代码复用性和灵活性。关键是理解编译期实例化的机制,避免链接错误或模糊的编译报错。多练习标准库风格的泛型写法,有助于深入理解STL的设计思路。









