函数模板
当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传递给他的参数类型动态调用对应的函数版本,实现多种类型的比较。
1 | template <typename T> |
比较函数是一个模板函数,它支持T类型的对象比较,模板函数定义的规则是用template
调用的规则传递实参就可以了,前提是实参的类型要支持比较大小,如果是类的类型我们可以重载比较运算符。
1 | int res = compare(3, 4); |
我们分别传递了int类型和vector
1 | template <typename T, typename U> |
调用规则和上边类似,传递两个不同类型即可
1 | printData(3.4, "hello world"); |
模板函数也支持非参数类型,用已知类型定义变量
1 | template <unsigned N, unsigned M> |
compareArray的模板里用了已知类型unsigned定义了两个变量N和M。
调用的时候N和M会自动根据实参获取值
1 | res = compareArray("hello zack", "nice to meet u"); |
M和N就是传递的两个数组的长度。
类模板
我们实现一个模板类,使其支持类似vector的操作,包括push_back, empty, back, 以及pop_back,取索引[]操作等。
1 | //定义模板类型的blob |
我们在类外实现check, pop_back, back, 以及[]操作。
1 | template <typename T> |
每一个类的成员函数在类外实现时都要声明template
类模板的使用如下
1 | void use_classtemp() |
我们也可以对类的成员函数做模板的定义
1 | //模板类的T类型 |
我们可以写一个函数测试上面的模板成员函数
1 | void use_tempmemfunc() |
通过迭代器构造Blob类,实现多种类型的绑定。
总结
源码链接 https://gitee.com/secondtonone1/cpplearn
视频链接 https://www.bilibili.com/video/BV1yY4y187SC?spm_id_from=333.999.0.0