C++ STL之functor

1. functor 仿函数

1.1仿函数和函数对象

  1. 仿函数(functors,别名function object)是我们最容易自己写,然后融入标准库的部件。只为算法服务。仿函数要模仿函数,必须重载operator(),并且是个class。由此产生的对象称为函数对象,或者叫仿函数(是一个对象,像一个函数)。一般意义上重写了operator()方法的类就是一个仿函数。仿函数的调用包括三种形式:通过构造临时对象调用operator(),通过对象隐式调用operator(),通过对象显示调用operator()。

    class Judge
    {
    public:
        bool operator() (int value)
        {
            return (0 == value % 2);
        }
    };
    
    int main() {
        Judge judge;
        int s = 3;
        // 1. 通过构造临时对象,调用operator()重载函数
        cout << judge(s);
        // 2. 通过对象,隐式调用调用operator()重载函数
        cout << Judge().operator()(s);
        // 3. 通过对象,显示调用operator()重载函数
        cout << judge.operator()(s);
    }
    
  2. 每个标准库定义的仿函数都继承了一个东西(unary_function、binary_function),自己定义的仿函数如果没有继承,那就没有融入STL体系结构中。继承了就能被适配器(adapter)去修饰和改造。 在这里插入图片描述

  3. 标准库定义的仿函数继承的类有unary_function、binary_function,unary_function有两个模板参数,其中一个是返回类型;,binary_function有三个模板参数,其中一个是返回类型。另外,这两个模板类仅仅只是将传入的模板参数换个名字。这是因为functor要回答adapter的问题。所以仿函数的可适配的条件是仿函数要继承unary_function或binary_function
    在这里插入图片描述

    namespace test {
        template <typename T>
        class less : public binary_function<T, T, bool>
        {
        public:
            bool operator() (const T &x, const T &y) const
            {
                return x < y;
            }
        };
    }
    void getType(int ) {
        cout << "int" << endl;
    }
    void getType(double ) {
        cout << "double" << endl;
    }
    int main() {
        //继承binary_function之后,可以调用first_argument_type,second_argument_type,所以有能力回答adapter的提问
        typename test::less<int>::first_argument_type x;
        typename test::less<double>::second_argument_type y;
        getType(x);
        getType(y);
        return 0;
    }
    

    输出:

    int
    double
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值