1、仿函数的概念
仿函数是一个是通过重载()运算符模拟函数形为的类。
2、实现方法
下面是一个简单的实现方法:
//看看字符串是否小于一个长度 class Test{ public: explicit Test(int lenth) : len(lenth){} bool operator() (const QString& str) const{ return str.length() < len; } private: const int len; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString str = "abcde"; int len1 = str.length()-1; int len2 = str.length()+1; //使用方法1 qDebug()<<Test(len1)(str)<<endl; //使用方法2 Test t(len2); qDebug()<<t(str)<<endl; return a.exec(); }
3、仿函数的应用场景
对于上面应用,很明显,可以简单定义一个比较的函数,用来处理字符长度的比较工作。因此,如果想要利用仿函数,一定是需要用到仿函数类的功能,譬如:仿函数类定义的时候,可以传递一个参数,()操作的时候,也可以传递参数,两种参数有作用优先级的时候,可以考虑这种使用方法。下面实现一个简单工厂模式:
class Operation { public: int a = 0; int b = 0; Operation(int ia,int ib){ a = ia; b = ib; } public: virtual bool GetResult(int) =0; }; class OperateIn:public Operation { public: OperateIn(int ia,int ib): Operation(ia, ib) {} //判断输入的i是否在 a和b 之间 bool GetResult(int i) { if(i>a && i<b) return true; return false; } }; class OperateOut:public Operation { public: OperateOut(int ia,int ib): Operation(ia, ib) {} //判断输入的i是否在 a和b 之外 bool GetResult(int i) { if(i>a && i<b) return false; return true; } }; //工厂类 class Test{ public: Operation *opt = nullptr; explicit Test(char op) : operate(op){} //通过仿函数,返回实际的对象 Operation* operator() (int a,int b){ switch(operate) { case 'i': opt = new OperateIn(a,b); break; case 'o': opt = new OperateOut(a,b); break; } return opt; } private: const char operate; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Test t('i'); Operation *pt = t(1,5); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; pt = t(1,8); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; Test t2('o'); pt = t2(1,5); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; return a.exec(); }
可以看到,通过类定义,传递“i”和“o”两种操作方法,()将作用范围传递进去
作者:禅在心中
出处:http://www.cnblogs.com/pinking/
本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法