函数模板
- 泛型编程: 独立于特定类型的方式编写代码
- 模板是泛型编程的基础
STL/Boost含有大量模板
- 现在框架大多都是用了模板
- 类模板和函数模板
- 模板使程序员能够快速建立具体类型安全的类库和函数集合, 方便大规模的软件开发
-
泛型编程
定义模板: 模板是为了解决除了函数参数类型不同其余相同的一类函数而出现的
#include <iostream> template <typename T> //模板的的参数类型关键字可以换为class //等效于template <class T> T comp(T a,T b) { return a > b ? a : b; } int main() { std::cout << comp(6.2,7.3) << std::endl; //通过编译器生成不同类型的模板成为模板的实例 return 0; } //由于浮点数的精度比较存在问题所以采用另一种方法 #include <iostream> #include <iomanip>//关于cout输出格式的控制 const int flag = 1e-6; template <typename T> T comp(T a,T b) { if( a - b > flag) { return a; } else return b; } int main() { std::cout << std::setw(6) << comp(2.00001,2.0) << std::endl; std::cout << comp(6,7) << std::endl; return 0; }
非类型模板参数
通过特定的类型名, 而非关键字来指定
class
或者typename
来指定参数#include <iostream> template <unsigned n,unsigned m> //编译器会是如下调用 //void compare(const char (&arr)[3],const char (&arr1)[6]) void compare(const char (&arr)[n],const char (&arr1)[m]) { std::cout << arr << " "<< arr1 << std::endl; } int main() { compare("hi","world"); return 0; }
模板函数和类模板成员函数的定义通常放在头文件中