# 五. 模板

模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现真正的代码重用

  • 函数模板

    格式:template <class 类型参数> //template是声明模板的关键字。class 或typename,表示任何类型,也可用于自定义类

    返回类型 函数名(模板形参表)

    { 函数体 }

    如:

    template <typename T>  //T为类型名
    T getmax(T a,T b)
    {
        if(a>b)  return a;
        else     return b;
    }
    
    1
    2
    3
    4
    5
    6

    写两种功能不同的函数模板时,即使参数列表相同,也需要在每个函数模板前写 “ template <class 类型参数> ”

  • 模板函数

    函数模板的实例化

    当编译系统发现有一个函数调用: 函数名(模板实参表);时,将根据模板实参表中的类型生成一个函数,叫模板函数,该模板函数的函数体与函数模板的函数定义体相同

​ 如:

getmax(6,7);      //实例化为getmax(int,int)
getmax('u','p');  //实例化为getmax(char,char)
1
2
  • 类模板

    格式:template <类型形参列表>

    class 类模板名

    { 类模板体定义 };

    类模板的成员函数可以放在类模板中定义,也可以放在类模板外部定义,类模板的成员函数其实都是函数模板

    一般形式:template <类型形参列表>

    函数返回类型 <u>类模板名 <类型名表>::</u>函数名(形参表)

    { 函数体 }

    如:

    #include <iostream>
    
    // 类模板,接受三个类型参数 T1, T2, T3
    template <typename T1, typename T2, typename T3>
    
    class TripleTemplate {
    private:
        T1 data1;
        T2 data2;
        T3 data3;
    
    public:
        // 构造函数
        TripleTemplate(T1 val1, T2 val2, T3 val3) : data1(val1), data2(val2), data3(val3) {}
    
        // 打印数据的成员函数
        void printData() const {
            std::cout << "T1: " << data1 << ", T2: " << data2 << ", T3: " << data3 << std::endl;
        }
    
        // 示例:一个接受三个相同类型参数的函数(这里只是为了演示)
        // 注意:这个函数并不要求T1, T2, T3必须是相同的类型
        void someFunction(T1 arg1, T2 arg2, T3 arg3) {
            // 这里可以添加一些逻辑处理 arg1, arg2, arg3
            // 但为了简单起见,我们只是打印它们
            std::cout << "Arguments: " << arg1 << ", " << arg2 << ", " << arg3 << std::endl;
        }
    };
    
    int main() {
        
        // 实例化 TripleTemplate,使用 int, double, std::string 类型
        TripleTemplate<int, double, std::string> tt(10, 3.14, "Hello");   //!!!!!!!!!!先实例化参数,再定义对象
    
        // 调用成员函数
        tt.printData();
        tt.someFunction(1, 2.0, "World"); // 注意这里我们传递了不同类型的参数给 someFunction
    
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
上次更新时间:: 2/9/2025, 9:12:58 PM