【关于template】

【关于template】模版

函数模版

代表了一个函数家族,与类型无关
在使用时被参数化根据实参类型产生函数的特性类型版本
image
举例 生成了两个不同的函数
image

定义函数模版

template<class T>//template<typename T>
//变量类型直接用T代替
T 函数名(T x, T y,...)
{
	...
}

模版参数实例化

隐式实例化

让编译器根据实参类型,自己推演
image
->会报错
->解决方案:强制类型转换

显式实例化

image
->不会报错

类模版

实例化后的类是真正的类

代码模版

template<class T1, class T2, ..., class Tn>//变量类型代称
class A
{
 // 类内成员定义
};

示例代码

#include<bits/stdc++.h>
using namespace std;
template<class T1,class T2>
class Pair{
    public:
        Pair(T1 fi,T2 se){
            first_=fi;
            second_=se;
        }

        T1 getFirst(){
            return first_;
        }

        T2 getSecond(){
            return second_;
        }

    private:
        T1 first_;
        T2 second_;
};
int main(){
    Pair<int,int> pair_one=Pair(10,20);
    cout<<"PairOne:"<<pair_one.getFirst()<<" "<<pair_one.getSecond()<<endl;
    Pair<int,string> pair_two=Pair(555,(string)"vw50");
    cout<<"PairTwo:"<<pair_two.getFirst()<<" "<<pair_two.getSecond()<<endl;
    return 0;
}

模版参数

类型形参

typename T

非类型形参

size_t N=10

示例代码

(有点问题)

//手写array
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
namespace qwq{

template<typename T,size_t N=10> //size_t N :如果没有定义数组长度默认10
class Array{
    public:
        //引用:可修改和查询
        T& operator[](size_t index){
            return array_[index];
        }
        //常量:只允许查询
        const T& operator[](size_t index) const {//记得后面还要加const
            return array_[index];
        }
        //查询长度
        size_t size(){
            return _size;
        }
        //查询是否为空
        bool empty(){
            return _size==0;
        }

    private:
        T array_[N];
        size_t _size;
};

}
int main(){
    qwq::Array<int,555> a1;
    qwq::Array<int> a2;
    cout<<a1.size()<<endl;
    cout<<a2[3]<<endl;
    return 0;
}

模版分离编译

如果有用到template:不能分成hpp和cpp

//.hpp内
//声明
template<class T>
T Add(const T& left, const T& right);
void Func();
//定义
template<class T>
T Add(const T& left, const T& right){return left + right;}
void Func(){std::cout << "Func()" << std::endl;}
posted @ 2025-02-19 21:30  White_ink  阅读(31)  评论(0)    收藏  举报