前言:模版(Template)是一把开启强大代码复用和通用编程的 “金钥匙”。它允许程序员编写灵活、高效且可扩展的代码,以应对复杂多变的项目需求。
目录
模板
解决代码重复的 “神器”
函数模板
一个顶十个
类模板:打造通用数据容器
创建类模板
使用类模板
模板特化
给特殊类型特殊待遇
综合实践案例:万能计算器
创建函数模板
创建类模板
使用万能计算器
总结
在 C++ 编程中,有没有遇到过这样的烦恼?写一个函数交换两个变量的值,却要为不同数据类型重复写多个类似的函数。像下面这样:
void swapInt(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void swapFloat(float &a, float &b) {
float temp = a;
a = b;
b = temp;
}
这种重复劳动简直就像在 “车轮大战” 中不断造轮子。别担心,模板闪亮登场啦!它就像一个神奇的万能模具,能轻松搞定不同数据类型的函数或类。
创建函数模板
// 我是万能函数模板,能处理各种类型的数据哦
template
void swap(T &a, T &b) {
T temp = a; // 把a的值存到temp里
a = b; // 把b的值给a
b = temp; // 把temp(也就是原来的a)的值给b
std::cout << "交换完成啦!" << std::endl;
}
template
就是告诉编译器:“嘿,我要用模板啦,T就是一个占位符,代表任意类型哦。”
使用函数模板:
int main() {
int x = 5, y = 3;
double a = 3.14, b = 2.718;
std::cout << "交换前:x = " << x << ", y = " << y << std::endl;
swap(x, y); // 调用模板函数,T是int类型
std::cout << "交换后:x = " << x << ", y = " << y << std::endl;
std::cout << "交换前:a = " << a << ", b = " << b << std::endl;
swap(a, b); // 调用模板函数,T是double类型
std::cout << "交换后:a = " << a << ", b = " << b << std::endl;
return 0;
}
输出结果:
交换前:x = 5, y = 3
交换完成啦!
交换后:x = 3, y = 5
交换前:a = 3.14, b = 2.718
交换完成啦!
交换后:a = 2.718, b = 3.14
一个模板函数就像一个 “超级变形金刚”,能灵活应对各种类型的数据交换任务,是不是超方便?
// 我是一个万能盒子,能装各种类型的数据哦
template
class Box {
private:
T value; // 存放的数据
public:
// 构造函数,给盒子装数据
Box(T val) : value(val) {
std::cout << "盒子创建啦,数据装好咯!" << std::endl;
}
// 获取盒子中的数据
T getValue() const {
std::cout << "我要把数据给你啦!" << std::endl;
return value;
}
// 设置盒子中的数据
void setValue(T val) {
value = val;
std::cout << "数据更新啦!" << std::endl;
}
};
int main() {
// 创建一个装int的盒子
Box intBox(42);
std::cout << "intBox中的数据是: " << intBox.getValue() << std::endl;
// 创建一个装double的盒子
Box doubleBox(3.14159);
std::cout << "doubleBox中的数据是: " << doubleBox.getValue() << std::endl;
// 更新doubleBox中的数据
doubleBox.setValue(2.71828);
std::cout << "更新后的doubleBox中的数据是: " << doubleBox.getValue() << std::endl;
return 0;
}
输出结果:
盒子创建啦,数据装好咯!
intBox中的数据是: 42
我要把数据给你啦!
盒子创建啦,数据装好咯!
doubleBox中的数据是: 3.14159
我要把数据给你啦!
数据更新啦!
更新后的doubleBox中的数据是: 2.71828
我要把数据给你啦!
类模板就像是一个神奇的 “百宝箱制造机”,能轻松为我们打造不同类型的通用数据容器。
有时候,对于某些特定类型,我们想给它特殊的处理。这时候就可以用模板特化啦。
创建普通模板和特化模板 :
// 这是普通的盒子模板
template
class Box {
public:
void printType() const {
std::cout << "这是一个普通盒子,装的是:";
}
};
// 这是装int的特殊盒子
template <>
class Box {
public:
void printType() const {
std::cout << "这是一个装int的特殊盒子哦!" << std::endl;
}
};
// 这是装double的特殊盒子
template <>
class Box {
public:
void printType() const {
std::cout << "这是一个装double的特殊盒子哦!" << std::endl;
}
};
使用模板特化 :
int main() {
Box intBox;
Box doubleBox;
Box stringBox;
intBox.printType();
doubleBox.printType();
stringBox.printType();
return 0;
}
输出结果:
这是一个装int的特殊盒子哦!
这是一个装double的特殊盒子哦!
这是一个普通盒子,装的是:
通过模板特化,就像给不同类型的数据量身定制专属的 “服务”,让每个类型都能得到恰到好处的处理。
下面,我们来创建一个万能计算器,它可以对不同类型的数值进行加减乘除运算。
// 万能计算器的加法函数
template
T add(T a, T b) {
std::cout << "正在执行加法运算: " << a << " + " << b << " = ";
return a + b;
}
// 万能计算器的减法函数
template
T subtract(T a, T b) {
std::cout << "正在执行减法运算: " << a << " - " << b << " = ";
return a - b;
}
// 万能计算器的乘法函数
template
T multiply(T a, T b) {
std::cout << "正在执行乘法运算: " << a << " * " << b << " = ";
return a * b;
}
// 万能计算器的除法函数
template
T divide(T a, T b) {
if (b != 0) {
std::cout << "正在执行除法运算: " << a << " / " << b << " = ";
return a / b;
} else {
std::cout << "错误:除数不能为零哦!" << std::endl;
return 0;
}
}
// 万能计算器类模板
template
class Calculator {
private:
T num1;
T num2;
public:
// 构造函数
Calculator(T n1, T n2) : num1(n1), num2(n2) {
std::cout << "万能计算器启动啦,已加载数字: " << num1 << " 和 " << num2 << std::endl;
}
// 执行加法运算
T performAddition() {
return add(num1, num2);
}
// 执行减法运算
T performSubtraction() {
return subtract(num1, num2);
}
// 执行乘法运算
T performMultiplication() {
return multiply(num1, num2);
}
// 执行除法运算
T performDivision() {
return divide(num1, num2);
}
};
int main() {
// 创建一个处理int类型数值的计算器
Calculator intCalc(10, 3);
std::cout << intCalc.performAddition() << std::endl;
std::cout << intCalc.performSubtraction() << std::endl;
std::cout << intCalc.performMultiplication() << std::endl;
std::cout << intCalc.performDivision() << std::endl;
std::cout << "------------------------" << std::endl;
// 创建一个处理double类型数值的计算器
Calculator doubleCalc(10.5, 3.2);
std::cout << doubleCalc.performAddition() << std::endl;
std::cout << doubleCalc.performSubtraction() << std::endl;
std::cout << doubleCalc.performMultiplication() << std::endl;
std::cout << doubleCalc.performDivision() << std::endl;
return 0;
}
输出结果:
万能计算器启动啦,已加载数字: 10 和 3
正在执行加法运算: 10 + 3 = 13
正在执行减法运算: 10 - 3 = 7
正在执行乘法运算: 10 * 3 = 30
正在执行除法运算: 10 / 3 = 3
------------------------
万能计算器启动啦,已加载数字: 10.5 和 3.2
正在执行加法运算: 10.5 + 3.2 = 13.7
正在执行减法运算: 10.5 - 3.2 = 7.3
正在执行乘法运算: 10.5 * 3.2 = 33.6
正在执行除法运算: 10.5 / 3.2 = 3.28125
这个万能计算器案例充分展现了模板的强大。无论是整数还是小数,都能轻松处理,而且代码结构清晰,易于扩展。
C++模板是C++中一个强大而灵活的特性,它可以帮助你编写通用、高效的代码。对于初学者来说,理解模板的基本概念和语法是第一步。通过不断实践和尝试,你会逐渐掌握模板的精髓,并将其应用到实际项目中,提升代码的质量和可维护性。