functional仿函数,函数对象

中文标准库:头文件<functional>

函数指针与回调函数

lambda:匿名函数

function底层分配机制:暴力malloc,实时分配性能低下。

std::function<int(int, int)> f = lambda/普通函数/类函数/函数对象/模版函数/bind/

一、标准库中的常用函数对象

  • std::bit_or

  • std::equal_to

  • std::plus

  • std::bind2nd

  • std::bind -> placeholders

  • std::greater

  • std::less

运算符

二、仿函数的优点

  • 仿函数是对象,可以拥有成员函数和成员变量,即仿函数拥有状态(states)

  • 每个仿函数都有自己的类型

  • 仿函数通常比一般函数快(很多信息编译期确定)

三、仿函数(std::function)和函数指针

仿函数是一个,是数据以及对数据操作的行为的集合,要成为仿函数必须重载()。函数指针是无法保存数据的,所以仿函数比函数指针功能更强,因为它可以保存数据,这一特性,是函数指针无法比拟的优势。

转载:std::function和std::bind的使用 讲的挺全面

#include <iostream>
#include <functional>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    typedef int(*fun)(int, int);     //函数指针,指针名:fun,参数为:int,int返回值为:int
    std::function<int(int, int)> b;  //std::function仿函数,函数对象名:b,参数为:int,int返回值为:int

    fun a = add;
    b = add;
    std::cout << a(2, 3) << '\n';
    std::cout << b(3, 4) << '\n';

    return 0;
}

std::function指向类成员函数,静态成员函数和普通函数用法一致。

#include <functional>

class Test {
public:
    int fun(int x, int y) 
    {
        return x + y;
    }
};

int main()
{
    Test test;
    // 方式1:fun1的类型可以为auto
    std::function<int(int, int)> fun1 = std::bind(&Test::fun, test,std::placeholders::_1, std::placeholders::_2);
    int result1 = fun1(1, 2);

    // 方式2:fun2的类型必须明确指定,不能为auto
    std::function<int(Test, int, int)> fun2 = &Test::fun;
    int result2 = fun2(test, 1, 2);

    return 0;
}

四、std::function和std::bind

std::bind std::mem_fn std::invoke
std::function是一个类,std::bind是一个函数(具体可以看functional头文件中的定义)

std::function是函数对象,std::bind生成一个函数对象。

posted @ 2021-05-24 16:34  滴哒哒哒  阅读(154)  评论(0编辑  收藏  举报