一、function介绍

funciotn是从c++11开始支持的特性,使用它需要包含头文件

在cppreference中解释为:类模板std::function是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。

通俗的来说可以把它当做一个函数指针来使用

二、function使用

function的模板是 std::function 方法名

这里传入参数类型可以是自己定义的

举几个简单的例子:

std::function<int(int)> display;

这表示我定义了一个名为display的函数指针,它传入的参数类型是int,返回值类型也是int

struct student{    int age;    int name;};int main(){    std::function<int(student a)> student1;        return 0;}

这里我自己定义了一个student类型,然后将student1的传入参数设置为student类型

如下是一个基本的用法

#include#include#includeint show(int a){    std::cout << a << std::endl;    return 0;}int main(){    std::function<int(int)> display = show;    display(-5);    return 0;}

我们让这个display = show(这里要注意传入参数和返回值类型的匹配)代表着我们可以通过display来调用show,从而来输出我们想要输出的数字

然后我们来展示一下函数指针的用法

#include#include#includeint add(int a){    std::cout << ++a << “ ”;    return a;}int decrease(int a){    std::cout << --a << std::endl;    return a;}int main(){    std::function<int(int a)> a(&add);    a(5);    a = &decrease;    a(5);    return 0;}

这里我们先让a执行add函数,然后让a = &decrease再执行decrease函数,执行出的结果为6 4

个人认为function最常用的是与lambda相结合,可以提高函数的灵活性

例如:

#include#include#includeint main(){    int arr[5] = {1, 5, 4, 8, 6};    std::function<int(int a, int b)> cmp = [&](int a, int b)    {        return a > b;    };    sort(arr, arr + 5, cmp);    for (int i = 0; i < 5; i++)        std::cout << arr[i] << " ";    return 0;}
输出的结果为8 6 5 4 1

通过function构造的一个cmp函数,结合lambda语法实现降序排列,这只是一个简单的用法,你可以构造其他的函数比如dfs等