本文内容组织形式
- 为什么需要template特性?
- 使用方法
- 原理
- 重载&模版C++代码实现
- Linux编译汇编码命令
- 结论
- 猜你喜欢
- PS
为什么需要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++多线程: https://blog.csdn.net/luog_aiyu/article/details/145548529
一文了解LevelDB数据库读取流程:https://blog.csdn.net/luog_aiyu/article/details/145946636
一文了解LevelDB数据库写入流程:https://blog.csdn.net/luog_aiyu/article/details/145917173
PS
你的赞是我很大的鼓励
欢迎大家加我飞书扩列, 希望能认识一些新朋友~
二维码见: https://www.cnblogs.com/DarkChink/p/18598402