为什么需要template特性?
总结: 本质上C++的template和Java的范性是一个东西,是高级语言中的语法糖,本质上编译生成的汇编代码,和同时使用重载特性生成的汇编码一样。
使用方法
#include <iostream>
// 模版例子
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
// 使用整数
std::cout << "整数相加: " << add(5, 3) << std::endl;
// 使用浮点数
std::cout << "浮点数相加: " << add(5.5, 3.7) << std::endl;
// 使用字符
std::cout << "字符相加: " << add('A', 1) << std::endl;
return 0;
}
如上例子,相当于可以使用不同的数据类型来实现同一个方法,但这种方法其实C++中其他方法也能实现这种扩展的方法,例如如下重载的例子,但是现在只需要使用模版即可,并且从原理上看模版是从相当于塑造了一个编译器中的“抽象模版”,如果调用这个模版来进行代码生成,一个"代码蓝图",编译器根据使用生成具体函数, 更抽象一些说,本质上操作系统是贴在裸金属上的一层皮,编译器是贴在操作系统上的一层皮,而C++等高级语言是长在编译器上的头发
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
char add(char a, int b) {
return a + b;
}
原理
接下来说说 template依托那些计算机抽象来实现,这段逻辑是在编译器中进行实现,这里我们只关注编译器生成的汇编码是否有区别 PS: 以下内容可看可不看,不涉及到底层编译器开发的话,没必要知道,只是一堆逻辑 例如以下是分别使用模版和重载实现相同功能的业务代码,并使用linux命令进行汇编码生成
重载&模版C++代码实现
#include <iostream>
#include <string>
#include "template_example.hpp"
class Calculator {
public:
// 整数加法重载
int add(int a, int b) {
return a + b;
}
// 浮点数加法重载
double add(double a, double b) {
return a + b;
}
// 字符串连接重载
std::string add(const std::string& a, const std::string& b) {
return a + b;
}
};
int main() {
// 测试函数重载
Calculator calc;
std::cout << "整数相加: " << calc.add(5, 3) << std::endl;
std::cout << "浮点数相加: " << calc.add(3.14, 2.86) << std::endl;
std::cout << "字符串连接: " << calc.add("Hello, ", "World!") << std::endl;
// 测试函数模板
std::cout << "整数最大值: " << max(10, 20) << std::endl;
std::cout << "浮点数最大值: " << max(3.14, 2.86) << std::endl;
// 测试类模板
Container<int> intContainer(42);
Container<std::string> strContainer("Hello Template!");
std::cout << "整数容器值: " << intContainer.getValue() << std::endl;
std::cout << "字符串容器值: " << strContainer.getValue() << std::endl;
return 0;
}
#include <iostream>
#include <string>
// 使用模板方式实现计算器
template<typename T>
class TemplateCalculator {
public:
// 加法
T add(T a, T b) {
return a + b;
}
// 减法
T subtract(T a, T b) {
return a - b;
}
// 乘法
T multiply(T a, T b) {
return a * b;
}
};
int main() {
TemplateCalculator<int> intCalc;
TemplateCalculator<double> doubleCalc;
// 测试整数运算
std::cout << "Template Int: " << std::endl;
std::cout << "1 + 2 = " << intCalc.add(1, 2) << std::endl;
std::cout << "5 - 3 = " << intCalc.subtract(5, 3) << std::endl;
std::cout << "4 * 2 = " << intCalc.multiply(4, 2) << std::endl;
// 测试浮点运算
std::cout << "\nTemplate Double: " << std::endl;
std::cout << "1.5 + 2.3 = " << doubleCalc.add(1.5, 2.3) << std::endl;
std::cout << "5.5 - 3.2 = " << doubleCalc.subtract(5.5, 3.2) << std::endl;
std::cout << "4.2 * 2.1 = " << doubleCalc.multiply(4.2, 2.1) << std::endl;
return 0;
}
Linux编译汇编码命令
g++ -S template_test.cpp -o template.s
结论
汇编太多就不放了, 总结就是两个代码生成的汇编代码语义完全相同,从使用体验来说template本质上就是一个语法糖。
猜你喜欢
C++多线程: blog.csdn.net/luog_aiyu/a… 一文了解LevelDB数据库读取流程:blog.csdn.net/luog_aiyu/a… 一文了解LevelDB数据库写入流程:blog.csdn.net/luog_aiyu/a…
PS
你的赞是我很大的鼓励 欢迎大家加我飞书扩列, 希望能认识一些新朋友~ 二维码见: www.cnblogs.com/DarkChink/p…