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