当前位置: 首页 > article >正文

模板的用法

大家好,今天是用法系列的第n+m+1期,讲什么不用说了,标题上写着

模板是一个可定义类型的模型,可以理解为一个模型

1.初步认识

1.前言

模板是一种很有用的工具,假如你要用函数打印3+9,6.95+9.98,'a'+'b'的ASCII值,按照之前的理念,可以这么写

#include <iostream>
using namespace std;
int int_add(int a,int b){
	return a + b;
}

int double_add(double a,double b){
	return a + b;
}

int char_add(char a,char b){
	return a + b;
}
int main(){
	cout << int_add(3,9) << endl;
	cout << double_add(6.95,9.98) << endl;
	cout << char_add('a','b') <<endl;
	return 0;
}

 但太多重复的代码造成代码冗余,如何解决这个问题呢,当然有办法,那就是模板

2.使用用法

规格:

template<typename 类型1,typename 类型2,typ......>

理论上,你可以使用无数个模板

它可以使用在函数

#include <string>
template<typename T>
int add(T a, T b) {
    return a + b;
}
int main() {
    using namespace std;
    cout << add<int>(3, 9) << endl; //12
    cout << add<double>(6.95, 9.98) << endl; //16.93
    cout << add<const char>('a', 'b') << endl; //195(ASCII码)
    return 0;
}

当然,模板使用时可以不需要转换,某些编译器会自动判断类型

#include <iostream>

template<typename T>
T add(T t1, T t2)
{
	return t1 + t2;
}
int main()
{
    using namespace std;
	cout << add<int>(12, 'c') << endl;//'c'的ASCII码为99,111
	cout << add(2.8, 7.6) << endl; //隐式转换,10.4
	cout << add<int>(12.3,34.5) << endl;//double转换为int,46
	cout << add(4, 3); //7
	return 0;
}

这里'c'转换成了99(因为模板定义的是int),输出的值只看模板的类型

模板还可以用在类里

#include <iostream>
using namespace std;

template<typename T>
class m {
public:
    template<typename U> //模板声明
    void Swap(U& a, U& b) { //交换
        U c = a;
        a = b;
        b = c;
    }
    
    m(const T arr[5]) { //定义
        for (int i = 0; i < 5; i++) {
            this->arr[i] = arr[i];  // 修正为逐个元素赋值
        }
    }

    template<typename U> //模板声明
    void Sort() { //冒泡排序
        int flag;
        for (int i = 0; i < 5 - 1; i++) {
            for (int j = 0; j < 5 - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    Swap<T>(arr[j], arr[j + 1]);
                }
            }
        }
    }
    template<typename U>
    void Print_array() {
        for (int i = 0; i < 5; i++) {
            cout << arr[i] << " ";
        }
    }
private:
    T arr[5];
};

int main() {
    printf("====================\n");
    int array[5] = {3,2,5,7,0};
    double array2[5] = { 4.5,6.8,7.9,1.2,0.4 };
    m<int> myObj(array);
    myObj.Sort<int>();
    myObj.Print_array<int>();
    printf("\n===================\n");
    m<double> myObj2(array2);
    myObj2.Sort<double>();
    myObj2.Print_array<double>();
    printf("\n===================");
    return 0;
}

我们创建了一个类,模板为T,又写了一些函数,比如Sort(排序),Print_array(打印数组),和Swap(交换)和一个构造函数,构造函数用于定义数组,每个函数使用的模板都是U。之后在main函数创建了两个对象,使用了排序等函数,最后输出

3.注意事项

1.不能把变量,指针,函数名定义为模板名

2.不能在同一个模板创建一个以上参数,就像这样

template(typename T,typename T); //错误

3.当函数模板暂不运用在函数或不在同一个作用域,函数模板要创建多个模板函数时,用typedef货class修饰,否则无法解析,比如

template<typename T1, typename T2>
void printTwoTypes(T1 arg1, T2 arg2) {
    std::cout << "第一个参数为: " << arg1 << std::endl;
    std::cout << "第二个参数为: " << arg2 << std::endl;
}

是正确的

template<typename T1, typename T2>

只输入是错误的


http://www.kler.cn/a/407611.html

相关文章:

  • CSS中flex:1是什么属性
  • HashMap源码详解
  • python代码制作数据集的测试和数据质量检测思路
  • GESP考试大纲
  • springboot购物推荐网站的设计与实现(代码+数据库+LW)
  • 汇编语言基础
  • 2024数学建模亚太赛【C题】赛题详细解析
  • 经典战法【均线老鸭头】战法的机构构成,集中模型以及买卖操盘技术,技术要点图文详解
  • Oracle JDK(通常简称为 JDK)和 OpenJDK区别
  • Kafka - 消费者程序仅消费一半分区消息的问题
  • STM32 Nucleo-64 boards板卡介绍
  • 两个链表相交
  • Superset 二次开发之Superset技术栈分析
  • PCB上压接孔和过孔的孔径和公差要求相同,制造时有何影响
  • 浅谈vue3 和 vue2的区别
  • C4D细分曲面工具
  • Elasticsearch 实战应用:全面解析与实践
  • 关于电机(马达)在高速运转的时候可能影响单片机电路的原因和解决方法
  • Linux常用工具的使用(2):文本编辑器的使用
  • Frontend - 防止多次请求,避免重复请求
  • 【Spiffo】环境配置:VScode+Windows开发环境
  • Linux下X11协议理解
  • YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪
  • STM32解说
  • RabbitMQ1:初识MQ
  • The Yarn application application_xxx_xxx doesn‘t exist in RM