c++ 模板

1 函数模板

语法: (其中typename可以使用class代替)

template <typename 类型名称1, typename 类型名称2[, ...]> 返回值类型 函数名(形式参数){
    //TODO, 可以使用类型参数
}

举例

#include <iostream>
template <typename T> void Swap0(T *x, T *y){ //使用指针为参数
    T tmp;
    tmp = *x; // *x表示对指针解引用
    *x = *y;
    *y = tmp;
}
template <typename T> void Swap1(T &x, T &y){ //使用引用为参数
    T tmp;
    tmp = x; //x是对参数的引用
    x = y;
    y = tmp;
}

int main(){
    int a0=5, b0=6;
    Swap0(&a0, &b0); // 传地址(指针)给函数
    std::cout << "a0=" << a0 << ", b0=" << b0 << std::endl;

    float a1=5.1, b1=6.1;
    Swap1(a1, b1); //传实际的变量给函数
    std::cout << "a1=" << a1 << ", b1=" << b1 << std::endl;
}

2 类模板

语法:

template <typename 类型名称1, typename 类型名称2[, ...]> class 类名{
    //TODO;
};

举例

#include <iostream>
template <typename T0, typename T1> //定义类模板
class Point{
    public:
        Point(T0 x, T1 y);

        T0 getx() const;
        T1 gety() const;

        void setx(T0 x);
        void sety(T1 y);

        void show() const;

    private:
        T0 m_x;
        T1 m_y;
};

//类实现时, 需要带上模板头, 类名后面也要带上类型参数;
template <typename T0, typename T1> Point<T0, T1>::Point(T0 x, T1 y): m_x(x), m_y(y){}

template <typename T0, typename T1> T0 Point<T0, T1>::getx() const {return m_x;}
template <typename T0, typename T1> T1 Point<T0, T1>::gety() const {return m_y;}

template <typename T0, typename T1> void Point<T0, T1>::setx(T0 x){ m_x=x; }
template <typename T0, typename T1> void Point<T0, T1>::sety(T1 y){ m_y=y; }
template <typename T0, typename T1> void Point<T0, T1>::show() const {
    std::cout << "(" << m_x << ", " << m_y << ")" << std::endl;
}

int main(){
    Point<int, int> p0(1, 2); //创建对象时, 需要指明参数的具体类型;
    p0.show();
}
posted @ 2022-07-10 14:42  编程驴子  阅读(38)  评论(0编辑  收藏  举报