C++ template 学习笔记(第二章)
1. FUNCTION TEMPLATES
函数模版主要用来表示一系列的具有相似性质的函数,把这些不同函数间不同之处进行参数化。
模版一般形式:
1 template <typename T> 2 inline T const& max (T const& a, T const& b) 3 { 4 return a < b ? b : a; 5 }
对于多个类型参数 在尖括号中逗号隔开,如:template <typename T1, typename T2, ...>
如果使用到的类型不支持模版中使用到的操作,则会编译出错, 如:
std::complex<float> c1, c2; //此类型不支持小于判断 ... max (c1, c2); //编译期间会报错
由于类型参数T是根据参数类型而确定的,不能进行类型转换,因此对于一些特殊情况需要指定T的类型,如:
template <typename T> inline T const& max (T const& a, T const& b) { return a < b ? b : a; } ... max (2, 3); //T根据参数判断为int型,一切正常 max (4, 3.4); //T首先根据第一个参数判断为int型,第二个参数为double型,不是int型参数 编译报错 /* *解决方法 */ max (static_case<double> 4, 3.4); //将参数转换为double型 max<double> (4, 3.4); //直接指定 T 为double型
对于模版,也可以实现重载:
//无模版形式比较两个int型数大小 1111 inline int const& max (int const& a, int const& b) { return a < b ? b : a; } //比较两个值大小 2222 template <typename T> inline T const& max (T const& a, T const& b) { return a < b ? b : a; } //比较三个值大小 3333 template <typename T> inline T const& max (T const& a, T const& b, T const& c) { return max (max(a, b), c); } ... max (1, 33, 99); //三个参数,调用333 max (1.0, 3.3); //调用222的 max<double>形式 max ('a', 'b'); //调用222的 max<char>形式 max (7, 42); //优先调用非模版函数, 因此调用111 max<> (7, 42); //调用222的 max<int> 形式 max<double> (7, 42); //直接调用222的 max<double>形式 max ('a', 4.2); //将两个参数转换为int型后 调用111
对于max ('a', 4.2)调用,由于模版形式不支持类型转换,因此只能强行把 ‘a' 和 4.2 转换为 int 形式 在调用函数 111
最后一点,模版的所有重载形式必须定义在它被调用之前。