C++:模板

Cpp 中有两种模板:函数模板 和 类模板

他们都不能直接使用。使用时,必须对类型参数赋以具体的数据类型,才能得到可使用的模板函数和模板类(实例化)

函数模板

函数模板代表了一组函数的集合,不是一个实实在在的函数,不可以直接使用,编译系统也不为它产生任何可执行代码

cpp 复制代码
#include <iostream>
using namespace std;

template <class T>
T Max(T a, T b) 
{
    return a > b? a : b;
}

int main()
{
    cout << Max(10, 20) << endl;
    cout << Max(20.5, 15.3) << endl;
    cout << Max<int>(10, 20.5) << endl;
    cout << Max<double>(10, 20.5) << endl;
    return 0;
}

模板函数的重载

cpp 复制代码
#include <iostream>
#include <cstring>


template <class T>
T Max(T a, T b) 
{
    return a > b? a : b;
}

char* Max(char* a, char* b) 
{
    return (std::strcmp(a, b) > 0? a : b);
}

int main()
{
    std::cout << Max(5,6) << std::endl;
    std::cout << Max("g", "s") << std::endl;
    return 0;
}

类模板

类模板不是一个实实在在的类,是一组类的集合。

没有可执行的代码,使用时要实例化为模板类
类模板外定义成员函数

定义最开始要有与类模板完全一致的前缀

类名后要有"类型参数表"

cpp 复制代码
#include <iostream>
using namespace std;

template <class T1, class T2>
class Example 
{
protected:
    T1 x;
    T2 y;
public:
    Example(T1, T2);
    void print() { cout << "x = " << x << ", y = " << y << endl; }
};

template <class T1, class T2>
Example<T1, T2>::Example(T1 a, T2 b)
{
    x = a;
    y = b;
}

int main()
{
    Example<int,int> a(10,10);
    Example<int,double> b(20,30.5);
    Example<char,int> c('M',20);

    a.print();
    b.print();
    c.print();

    return 0;
}

程序实例

cpp 复制代码
#include <iostream>
#include <cstring>
#include <iomanip>

const int SUM = 5;

template <typename T>
class Student 
{
protected:
    std::string ID;
    std::string name;
    T score;
public:
    Student(std::string id="000", std::string na=" ", T sc=0)
    {
        ID = id;
        name = na;
        score = sc;
    }
    void Set(std::string ID, std::string name, T score)
    {
        this->ID = ID;
        this->name = name;
        this->score = score;
    }
    std::string GetID()
    {
        return ID;
    }
    std::string GetName()
    {
        return name;
    }
    T GetScore()
    {
        return score;
    }
};

class Group 
{
protected:
    Student<int> st[SUM];
    int sum;
public:
    Group();
    void Input();
    void Output();
    void SortByScore();
    void SortByName();
};


Group::Group()
{
    sum = SUM;
}

void Group::Input()
{
    int i;
    std::string id,na;
    int sc;
    for(i=0;i<sum;i++)
    {
        std::cout<<"Input ID: ";
        std::cin>>id;
        std::cout<<"Input name: ";
        std::cin>>na;
        std::cout<<"Input score: ";
        std::cin>>sc;
        st[i].Set(id,na,sc);
    }
}

void Group::Output()
{
    int i;
    std::cout<<"\n学号   姓名   成绩"<<std::endl;
    for(i=0;i<sum;i++)
    {
        std::cout<<std::setw(6)<<st[i].GetID()<<std::setw(6)<<st[i].GetName()<<std::setw(6)<<st[i].GetScore()<<std::endl;
    }
}

void Group::SortByScore()
{
    int i,j;
    Student<int> temp;
    for(i=0;i<sum-1;i++)
    {
        for(j=i+1;j<sum;j++)
        {
            if(st[i].GetScore()<st[j].GetScore())
            {
                temp = st[i];
                st[i] = st[j];
                st[j] = temp;
            }
        }
    }
}

void Group::SortByName()
{
    int i,j;
    Student<int> temp;
    for(i=0;i<sum-1;i++)
    {
        for(j=i+1;j<sum;j++)
        {
            if(strcmp(st[i].GetName().c_str(),st[j].GetName().c_str())>0)
            {
                temp = st[i];
                st[i] = st[j];
                st[j] = temp;
            }
        }
    }
}

int main()
{
    Group g;
    g.Input();
    g.Output();
    g.SortByScore();
    g.Output();
    g.SortByName();
    g.Output();
    return 0;
}
相关推荐
sinat_28694519几秒前
大模型推理:部署方式与性能优化思路
人工智能·算法·缓存·chatgpt·性能优化
longlongzihan1 分钟前
LeetCode 283. 移动零:从辅助数组到双指针原地算法
c++·算法·leetcode
在所不辞兄1 分钟前
【零基础学智能仿真-42】二维随机有限元实战——把随机材料场赋给网格单元
人工智能·深度学习·算法·机器学习·工程仿真
艾莉丝努力练剑3 分钟前
【AI大模型接入SDK】C++ ChatSDK使用手册
开发语言·网络·c++·人工智能·学习·大模型
罗湖老棍子4 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
“AI国潮设计-小江”9 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人9 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
奋发向前wcx9 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
by2099910 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
sunshine22 girl10 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习