C++ 系列之—仿函数

将内部重载了operator()操作符的类称为仿函数(functor)又称为函数对象(function object)。是一个能行使函数功能的类,仿函数的语法几乎和我们普通的函数调用一样。

形如:return_type operator()(para_type xxx), 例如:int operator()(int num);

仿函数的出现是为了代替函数指针的,最明显的一个特点是:可以使用内联函数。而如果使用内联函数的指针,编译器会把它当普通函数对待。另外,函数对象具有类封装的特性,代码不但看起来简洁,设计也灵活,比如还可以用关联,聚合,依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理。

#include <iostream>
#include <vector>
#include <algorithm>

class Functor{
public:
    Functor(int number):m_number(number){};
    Functor(std::string str):m_str(str){};
    int operator()(int number) const {
        return m_number+number;
    }
    std::string operator()(std::string str) const {
        return m_str+" "+str;
    }
private:
    int m_number;
    std::string m_str;
};

class Counter{
public:
    Counter(int size):m_size(size){};
    bool operator()(const std::string &str){
        if (str.size() > m_size){
            return true;
        }else{
            return false;
        }
    }
private:
    int m_size;
};

bool my_function(const std::string &str){
    if (str.size() > 5){
        return true;
    }else{
        return false;
    }
}

int main(){
    Functor obj1(100);
    Functor obj2("hello");
    //将仿函数对象当做函数来使用时,会调用内部重载的operator()函数
    std::cout<<obj1(33)<<std::endl;
    std::cout<<obj2("world!")<<std::endl;

    std::vector<std::string> name_vec{"ZhangSan", "LiSi", "GebiLaoWang"};
    //count_if()为统计一定范围的某份数据满足条件的所有元素的个数,
    //前两个参数为迭代器,第三个参数应是一个返回true或false 的函数对象
    int ret1 = count_if(name_vec.begin(), name_vec.end(), Counter(5));//仿函数对象
    int ret2 = count_if(name_vec.begin(), name_vec.end(), my_function);//普通函数指针
    std::cout<<"ret1="<<ret1<<" ret2="<<ret2<<std::endl;

    return 0;
}

运行结果:

仿函数对象不能直接复制给函数指针,不支持此种用法。

using func_type = std::string (*)(std::string);

type func = Functor("xxx");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值