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();
}