C++中的仿函数使用

C++中的仿函数使用

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”两种操作方法,()将作用范围传递进去

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119435.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jsp基础入门教程(自学素描基本入门教程)

    JSP 教程JSP与PHP、ASP、ASP.NET等语言类似,运行在服务端的语言。JSP(全称JavaServerPages)是由SunMicrosystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了

  • 20212.3 idea 激活码(最新序列号破解)

    20212.3 idea 激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • JAVA语言中的反射机制:

    JAVA语言中的反射机制:

  • listagg小记录[通俗易懂]

    listagg小记录[通俗易懂]listagg的作用是将分组范围内的所有行特定列的记录加以合并成行。函数签名中的measure_expr为分组中每个列的表达式,而delimiter为合并分割符。如果delimiter不设置的话,就表示无分割符。  中间withingroup后面的order_by_clause表示的是进行合并中要遵守的排序顺序。而后面的over子句表明listagg是具有分析函数analyze

  • phpproxy建立代理服务器_proxy设计模式

    phpproxy建立代理服务器_proxy设计模式代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务。而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,代理会帮他处理。代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。代理模式涉及的角色:抽象主题角色,声明了代理主题和真实主题的公共…

    2022年10月30日
  • 稳压管稳压电路

    稳压管稳压电路一、稳压管稳压电路:整流滤波电路的输出电压会随着电网电压的波动而波动,随着负载电阻的变化而变化。为了获得稳定性好的直流电压,必须采取稳压措施。二、稳压原理:对于任何稳压电路而言,都应该从两方面来考虑:电网电压波动、负载变化,研究其输出电压是否稳定。(1)、电网电压波动:(2)、负载变化:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号