c++函数模板与类模板
发布日期:2021-09-25 21:40:54 浏览次数:1 分类:技术文章

本文共 2541 字,大约阅读时间需要 8 分钟。

模板是c++泛型编程的基础,它可以以独立于任何特定类型的方式去编写代码。

目录


一、函数模板

先来看一个函数模板的定义和使用

template 
T const add(T const &a,T const &b){ return a + b;}int main(){ cout << "add(5,6)=" << add(5, 6) << endl; //输出11 return 0;}

声明模板的一般形式template<typename T> ,其中typename可以写完class,当然T也是可以改成其他名字的,这里只是一种习惯的写法。下面的代码和上面的写法实现是一致的。

template 
KO const add(KO const &a, KO const &b){ return a + b;}int main(){ cout << "add(5,6)=" << add(5, 6) << endl; //输出11 return 0;}

那么使用函数模板有什么好处呢?

在特定时刻,可以极大的减少我们的代码量,比如以下代码

double add(double a, double b){	cout << "我是double普通方法" << endl;	return a + b;}int add(int a, int b){	cout << "我是int普通方法" << endl;	return a + b;}//函数模板template 
T const add(T const &a,T const &b){ cout << "我是函数模板" << endl; return a + b;}int main(){ cout << "add(5,6)=" << add(5, 6) << endl; //输出11 cout << "add(5.1, 6.0)=" << add(5.1, 6.0) << endl; //输出11.1 return 0;}

效果:

int add(int a, int b)这个函数,如果需要传入double,我们就需要重载add,再写一个double add(double a, double b)函数。

这样子做会增加代码量,而且也容易出错,不好维护。

这时候可以采用函数模板,只需要写

template <typename T>

T const add(T const &a,T const &b)

即可。

注意:当存在同名的普通函数和函数模板的时候,编译器会优先调用普通函数。所以上面输出的就是

我是double普通方法 以及 我是int普通方法。

二、类模板

简单写一下类模板的实现

在这里,我们定义了一个类模板,然后把对应的视图类存储进map中,方便后期维护。

//类模板template 
class ChildView{public: void pushItem(std::string name,T const& Item); void removeItem(std::string name); void showItems(); bool isEmpty();private: map
m_viewMap;};template
void ChildView
::pushItem(std::string name, T const& Item){ m_viewMap[name] = Item;}template
void ChildView
::removeItem(std::string name){ auto iter = m_viewMap.begin(); iter = m_viewMap.find(name); if (iter != m_viewMap.end()) { iter = m_viewMap.erase(iter); }}template
void ChildView
::showItems(){ auto iter = m_viewMap.begin(); for (; iter != m_viewMap.end(); iter++) { cout << iter->first.c_str() << "--"; iter->second->showView(); } cout << endl;}template
bool ChildView
::isEmpty(){ if (!m_viewMap.empty()) return false; return true;}class IView{public: virtual void showView() = 0;};//下载界面class DownloadView:public IView{public: void showView() { cout << "下载界面" << endl; } //...};//关于界面class AboutView :public IView{public: void showView() { cout << "关于界面" << endl; } //...};int main(){ ChildView
view; IView* dv = new DownloadView; IView* av = new AboutView; view.pushItem("download", dv); view.pushItem("about", av); if (!view.isEmpty()) //如果不为空 { view.showItems(); cout << "-----------------" << endl; view.removeItem("about"); view.showItems(); } return 0;}

效果:

转载地址:https://blog.csdn.net/c_shell_python/article/details/107414889 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++之状态模式
下一篇:c++之模板方法模式

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月04日 16时58分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

git获取所有branch_使用jGit 通过gitUrl 获取Git的所有分支 2019-04-21
mysql like 数字结尾_重拾MySQL之正则表达式 2019-04-21
mysql where从句_《快速念咒——MySQL自学入门指南》:第1章第8节:模糊查询LIKE——一窝兔子(上)... 2019-04-21
mysql 重置密码_mysql忘记密码如何重置密码,以及修改root密码的三种方法 2019-04-21
python-docx tables后追加内容_Mac brew安装MySQL8.0.21后忘记密码(重置密码篇) 2019-04-21
python中两个时间相减结果转为小时_Python起步(二)基础数据类型1 2019-04-21
定义泛化。举个例子_网易考拉应用的dubbo泛化调用,是如何实现的? 2019-04-21
mysql里可以用cube吗_sql server的cube操作符使用详解_mysql 2019-04-21
php mysql 图书_使用PHP+MySQL来对图书管理系统进行构建 2019-04-21
单片机c语言 int1,51单片机into、int1中断计数c语言源程序.doc 2019-04-21
c语言课程设计工资管理建库,C语言课程设计工资管理系统参考.doc 2019-04-21
c语言case中途跳出,break语句在switch结构语句中的作用是终止某个case,并跳出switch结构语句。... 2019-04-21
c51写c语言外部ram头文件,C51中访问外部RAM的方法 2019-04-21
51c语言产生随机证书,基于51单片机的随机数产生器设计-LCD1602-KEY-(电路图+程序源码)... 2019-04-21
C语言编写程序计算高考倒计时天数,基于51单片机LCD12864大字符校时万年历带高考倒计时程序... 2019-04-21
c语言打开一个html文件路径,C语言文件处理-C语言文件的打开和关闭 2019-04-21
普职融通信息技术课本C语言,“三步走”扎实推进“普职融通”办学新模式 2019-04-21
Android多个签名,【Android】Android批量重签名 2019-04-21
html unicode编码转换,JS实现的Unicode编码转换操作示例 2019-04-21
html页面角落放动漫人物,L2Dwidget.js L2D网页动画人物添加 2019-04-21