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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • grub2引导u盘启动_grub4dos怎么进入系统

    grub2引导u盘启动_grub4dos怎么进入系统grub引导BT3硬盘启动                   阿太080611 一、这里使用grub引导程序,关于grub引导程序,这里不多说,其是一个很强的系统引导器,可以区分和引导各种系统.这里提供一个grubfordos安装程序;解压后copy到c:/boot/grub/目录下,并copymenu.lst和chinese目录中的文件grldr文件到C:/.

    2022年10月1日
    5
  • python endswith函数_Python的startswith和endswith

    python endswith函数_Python的startswith和endswith做文本处理的时候经常要判断一个文本有没有以一个子串开始,或者结束。Python为此提供了两个函数:S.startswith(prefix[,start[,end]])->bool如果字符串S以prefix开始,返回True,否则返回False。start和end是两个可以缺省的参数。分别是开始比较的位置和结束比较的位置。这个函数也可以写成S[start:end].startswith(pr…

    2025年6月3日
    8
  • 【内存泄漏】使用memwatch高效排查代码的内存泄漏问题

    【内存泄漏】使用memwatch高效排查代码的内存泄漏问题linux下使用memwatch高效排查代码的内存泄漏问题,是我推荐给大家需要掌握的排查技能,在提交允许的情况下,非常有效。

    2022年7月13日
    15
  • 送给大家一套完整的web前端开发学习路线

    本文来源:千锋web前端开发近几年IT业可谓是发展火热,而且新生了很多的职业。在这众多的新生职业中备受瞩目的当属web前端工程师了,web前端在IT行业真正受到重视的时间不超过五年,但是web前端的发展前景却是非常的可观,好前景高薪资吸引了众多的人投入到前端开发的学习当中去,想学好web前端,这份web前端开发学习路线分享给你。  好的学习方法和掌握好正确的学习路线可以让我们的…

    2022年4月11日
    72
  • pycharm激活码2021【永久激活】

    (pycharm激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    156
  • Activity启动模式singleTask的理解

    Activity启动模式singleTask的理解1.Activity启动模式singleTask的理解2.Task与Activity栈3.singleTask设置方式4.singleTask的意义(作用)4.1.举例说明4.2.例子14.3.例子24.4.小结5.taskAffinity属性5.1.配置方式5.2.意义(作用)5.3.举例5.4.回退顺序5.5.总结1.Activity启动模式singleTask的理解2.Task与Activity栈Task是一些Acti..

    2022年6月26日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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