C++ 函数模板与类模板

(1)函数模板

  • 参考:C++函数模板5分钟入门教程
  • C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。
  • 模板函数的语法:

template <typename 类型参数1 , typename 类型参数2 , ...> 返回值类型  函数名(形参列表){
    //在函数体中可以使用类型参数1,2...
}

【注:但有时候typename也可以用class来等价替换】

  • 简单的例子,通过模板可以少写很多"差不多的函数"
  • 比如需要swap函数,交换int,float,char这三种数据的函数实现可能如下
//交换 int 变量的值
void Swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

//交换 float 变量的值
void Swap(float *a, float *b){
    float temp = *a;
    *a = *b;
    *b = temp;
}

//交换 char 变量的值
void Swap(char *a, char *b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

//交换 bool 变量的值
void Swap(bool *a, bool *b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

 但是用函数模板就可以这样写:(且int a = 10; int b = 20;可以换成float char double都可以)

#include <iostream>

template <typename T> void Swap(T& a, T& b)
{
    T temp = b;
    b = a;
    a = temp;
}

int main() {
    int a = 10;
    int b = 20;
    std::cout << "start " << a << " "<< b << std::endl;

    Swap(a, b);

    std::cout << "over " << a << " "<< b << std::endl;
    return 0;
}

(2)类模板

  • 类模板的语法

//类模板的声明

template<typename 类型参数1 , typename 类型参数2 , …> class 类名{
    //TODO:
};

//类模板的定义

template<typename 类型参数1 , typename 类型参数2 , …>
返回值类型 类名<类型参数1 , 类型参数2, ...>::函数名(形参列表){
    //TODO:
}

  • 类模板:类函数的定义与类的声明
//类声明
template <typename T1, typename T2>
class Point {
public:
    Point(T1 x, T2 y):
    m_X(x),
    m_Y(y){
        
    };
    T1 getX() const;
private:
    T1 m_X;
    T2 m_Y;
};



//类定义
template <typename T1, typename T2>
T1 Point<T1, T2>::getX() const
{
    return m_X;
}

  • 类模板创建对象
Point<int, int> p1(10, 20); 
Point<int, float> p2(10, 15.5);

Point<float, float> *p1 = new Point<float, float>(10.6, 109.3); 

  • 简单的Demo
#include <iostream>

template <typename T1, typename T2>
class Point {
public:
    Point(T1 x, T2 y):
    m_X(x),
    m_Y(y){
        
    };
    T1 getX() const;
private:
    T1 m_X;
    T2 m_Y;
};

template <typename T1, typename T2>
T1 Point<T1, T2>::getX() const
{
    return m_X;
}

int main() {
    Point<float, int> p1(10.5, 20);
    std::cout << p1.getX() << std::endl;

    Point<float, int> *p2 = new Point<float, int>(10.2, 20);
    std::cout << p2->getX() << std::endl;

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值