[C++]从入门到精通-template

70 阅读3分钟

为什么需要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…