引言
在 C++ 世界里,模板(
Template
)就像一把万能钥匙。它允许你编写通用的代码,让编译器在需要的时候为具体类型生成对应的函数或类。换句话说,模板是 C++ 泛型编程(Generic Programming) 的基石。
- 如果说面向对象编程解决的是**“对象的多态**”,那么模板解决的就是“代码的多态”。
- 本篇文章我们将通过
函数模板
和类模板
来学习模板的基础知识。
一、概念
模板即字面意思,可以理解为制作雪糕的这个模板,在模板中填充不同口味的原料(类型),就会得到多个不同口味,相同形状(即具体类型的代码)的雪糕

二、函数模板
定义格式:
template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
template<……>要写在定义函数的前面一行
- 实现一个加法函数
int add(int a,int b)
,这个函数只能处理int
类型的参数 - 如果要对
double
、float
进行加法运算, - 需要再实现一个相同结构不同类型
double add(double a,double b)
的函数
这样的代码太过冗余,写一个加法函数的模板就可以解决;传入不同类型,运算不同类型对象;
1. 隐式实例化
和调用普通函数一样,调用模板函数,模板函数根据传入的参数类型推导模板类型
(⚠️注意:当模板参数只有一个只能传入同一种类型的参数,否则报错)
代码示例:
// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int main()
{//隐式实例化int a = 1, b = 2;cout << add(a, b) << endl;double c = 10.0, d = 20.0;cout << add(c, d) << endl;return 0;
}
2.显示实例化
- 调用模板函数时,在函数名后面加上
<类型>
,例如:add<int> (a,b);
<>
内的参数个数根据template <>
内的参数而定
代码示例:
// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}int main()
{//显示实例化int a = 1, b = 2;cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;cout << add<double>(c, d) << endl;//类型不匹配时,编译器自动进行类型转换,转换失败就报错cout<<add<int>(a,c)<<endl;return 0;
}
3. 普通函数和模板函数的优先级
- 一个普通函数与模板函数实例化后的函数类型完全相同时编译器优先调用普通函数
- 如果显示实例化(
add <int> (a,b)
),则会调用模板函数
using namespace std;
// 函数模板
template <class T>
T add(const T& a, const T& b)
{return a + b;
}
int add(int a,int b)
{return a + b;
}
int main()
{int a = 1, b = 2;//情况一:调用int add(int a,int b)普通函数cout << add(a, b) << endl;//情况二:调用T add(const T& a, const T& b)模板函数cout << add<int>(a, b) << endl;double c = 10.0, d = 20.0;//情况三:调用T add(const T& a, const T& b)模板函数cout << add(c, d) << endl;return 0;
}
三、类模板
定义格式
template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};
实例化
- 使用类模板进行实例化时,采用
类名+<类型>
的形式,且后面必须加上<>
;- 实例化的对象类型由
类名+<类型>
组成,例如:A<int> a1;
中的A<int>
是对象a1的类型,A
只是类名
代码示例:
// 类模板
template <class T>
class A
{
public:T add(const T& a, const T& b){return a + b;}
private:T a;T b;};int main()
{A<int> a1;A<double> a2;cout<<a1.add(1, 1)<<endl;cout<<a2.add(1.0, 1.0)<<endl;return 0;
}
四、总结
函数模板解决的是“写一次函数,适配多种类型”,而类模板则把这种灵活性带进了类的世界。二者加起来,就构成了 C++ 泛型编程的基本骨架。学会它们之后,你就能体会到——代码不再是写死的,而是可以像拼积木一样复用与扩展
写到这里,模板的基础操作就讲完了;如果本文对你有帮助,麻烦你 👍点赞 ⭐收藏 ❤️关注 吧~