C++模板template

引言

在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下:

 这个函数只支持int参数,那么float、long等怎么办呢,函数重载需要好几个函数,很麻烦,我们可以使用模板

函数模板

模板函数定义的一般形式如下所示:

template <typename 类型占位符>   返回值类型占位符 函数名(参数列表) { 函数的主体 }

注意:typename等价于class

#include <iostream>

template<typename  T> void swap(T& t1, T& t2) {  //函数模板的定义
    T tmpT;
    tmpT = t1;
    t1 = t2;
    t2 = tmpT;
}


int main() {
    int num1 = 1, num2 = 2;
    swap<int>(num1, num2);//函数模板的调用
    std::cout << "num1=" << num1 << "," << "num2=" << num2 << std::endl;
    

    return 0;

}

如果函数模板写在不同文件中,在.h文件的尾部要导入.cpp文件

类模板 

格式为:

    template<class 形参名,class 形参名,…>
    class 类名{ ... };

#include <iostream>

//类模板的定义
template<class T,class T1>
class A {
public:
    A(T a, T1 b) :m_i(a), m_f(b) {}
    T m_i;
    T1 m_f;
    void print() {
        std::cout << m_i << std::endl;
        std::cout << m_f << std::endl;
    }
    T print1() {
        return m_i + 100;
    }
};


int main() {
    
    A<int, float> aa(10,55.6);//创建对象
    aa.print();
    int x = aa.print1();
    std::cout << "x=" << x<<std::endl;
      

    return 0;

}

如果在类模板外实现函数体(h和cpp文件分开)时,注意书写格式:

template<class T,class T1> void A<class T,class T1>::print() { }
说明:template<class T,class T1> 是模板帽子
   
A<class T,class T1> 是编译后相应的类名

函数模板作为类模板成员

#include <iostream>


template<class T>
class A {
public:
    A(T a) :m_i(a){}
    T m_i;
    
    //成员函数模板
    template <class T1>  
    void Func(T1 t) {     
        std::cout << t<<std::endl; 
    }  
    
};


int main() {
    
    A<int> aa(10);
    aa.Func(89.6);  //成员函数模板Func被实例化
         

    return 0;

}

原文地址:https://www.cnblogs.com/liming19680104/p/13544109.html