C++03:模板 元编程
实现的功能相同,仅仅是涉及的数据类型不同。模板正是一种专门处理不同数据类型的机制
模板是泛型程序设计的基础
在函数定义时可以不指明具体的数据类型,当函数调用时,编译器根据传入的实参自动推断数据类型,这就是类型的参数化
在C++中能够带有类型参数的可以是函数和类,所以模板分为函数模板和类模板
模板是C++支持参数化多态的工具,通常有函数模板和类模板
函数模板针对仅参数类型不同的函数
类模板针对数据成员和成员函数类型不同的类
使用模板能够编写出与类型无关的代码
模版分为函数模版和类模版
按我的理解,C++设计出模版的作用就是把 数据类型和函数功能进行隔离,能够让代码的通用性更高一些,这就是更加适合封装和重用
二.函数模板
1.使用
函数模板中,会根据传入实参的类型来替换函数模板中形参
1 2 3 4 5 6 7 8 9 10 | //声明 template < class T> void Swap(T&a ,T&b){ ... } template < typename T> void Swap(T& a,T& b){ } |
1 2 3 | //调用 int a,b; Swap(a,b); |
2.例子
注意:一个模板声明对应一个函数
#include <iostream> #include <vector> using namespace std; template <typename T> inline T const& Max(T const& a, T const& b) { return a < b ? b : a; } int main() { int i = 39; int j = 20; cout << "Max(i,j)= " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2)= " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2)= " << Max(s1, s2) << endl; return 0; }
#include <iostream> using namespace std; //模板头,template关键字告诉编译器开始泛型编程 template<typename T> T add(T t1, T t2) //类型参数化为T { return t1+t2; } int main() { cout << add(12, 34) << endl; cout << add(12.2, 45.6) << endl; return 0; }
三.类模板
1.使用
类模板中,根据类<>里面的具体类型来替换类模板中形参类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //声明 template < class T> template < typename T> class A{ public : T a; T b; T swap(T c,T& d); }; //实现 T A<T>::swap(T c,T& d){ ... } |
1 2 3 | //调用 A< int > a; A<string> b; |
template<typename T> class A { public: T a; //成员变量 T b; //成员变量 T func(T a,T b); //成员函数声明 }
2.例子
注意:一个模板声明对应一个类,并且要重载不同的类型
1 2 3 4 5 6 7 8 9 10 | //TestMain.h template < class T> class A{ public : A(); T g(T a,T b); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | template < class T> A<T>::A(){ } template < class T> T A<T>::g(T a,T b){ return a+b; } int main(){ A< int > a; std::cout<<a.g(1,2)<<std::endl; system ( "pause" ); return 0; } |
四.泛型编程原理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)