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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 程序员们千万不要接私活(程序员找私活的平台)

    点击上方“码农突围”,马上关注,每天上午8:50准时推送这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看”作者:程序员新视界来源:…

    2022年4月11日
    137
  • angular5面试题_大数据面试题

    angular5面试题_大数据面试题Angular更新还是非常快的,目前(2020)的速度是每年2个主版本。网上也有不少面试题,不过很多都是针对老的版本,尤其是AngularJS的。因为最近在看Angular的面试题,所以特意总结一下。下面内容都是基于Angularv8.0以上的。顺便科普一下,Angular最早期的版本,也叫AnugularJS,使用javascript开发;新的版本,才叫Angular,也称为Angular2,使用typescript开发,Angular和AngularJS是不兼容的(当然也有2个版本的集成方案)。

    2022年10月18日
    2
  • CString和char*转换的理解

    CString和char*转换的理解

    2021年8月26日
    116
  • 操作系统概念第七章部分作业题答案

    操作系统概念第七章部分作业题答案题目一:考虑下图所示的交通死锁的情况:(1)请说明这个实例中死锁的4个必要条件(2)请设计一条简单的规则来避免产生死锁解答:(1):死锁的四个必要条件是:①互斥:至少一个资源非共享,即一次只能有一个进程使用②占有并等待:一个进程至少占有一个资源,并等待另一个资源,而该资源被其他进程所占有③非抢占:资源非抢占,只有当前进程完成任务才能被释放④循环等待:有一组等待进城P0…P…

    2022年7月14日
    16
  • 音频功放的种类和基本原理

    音频功放的种类和基本原理音频功放的种类和基本原理作者:AirCity2019.12.2Aircity007@sina.com本文所有权归作者Aircity所有1 简介功率放大器简称功放,它是将小信号放大,这个放大包括电压和电流,用更大的功率推动音响放声。在技术发展过程中,产生了不同类型的功放种类,按照功率管的导电方式,可以分为甲类功放(又称A类)、乙类功放(又称B类)、甲乙类功放(又称AB类)和丁类功放功…

    2022年6月4日
    33
  • PL/SQL简介_什么是SQL数据库

    PL/SQL简介_什么是SQL数据库PL/SQL

    2022年10月12日
    1

发表回复

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

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