C++ std::function详解

 更新时间:2021年10月11日 10:50:07   作者:物随心转  
类模版std::function是一种通用的多态函数包装器std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,本文详细的介绍一下,感兴趣的可以了解一下

一、介绍

std::function是函数模板类(是一个类)。包含在#include <functional> 中。以前没有这个类的时候,我们在想定义一个回调函数指针,非常的麻烦。我们通常这样的定义:

typedef  void(*ptr)(int,int)// 这里的ptr就是一个函数指针

而使用了std::function这个类的时候,我们可以这样使用,来替换函数指针。例如:

std::function<void(int ,int)> func;

std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。

它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)

二、实例

    #include <iostream>  
    #include <vector>  
    #include <list>  
    #include <map>  
    #include <set>  
    #include <string>  
    #include <algorithm>  
    #include <functional>  
    #include <memory>  
    using namespace std;  
    //声明一个模板  
    typedef std::function<int(int)> Functional;  
    //normal function  
    int TestFunc(int a)  
    {  
        return a;  
    }  
    //lambda expression  
    auto lambda = [](int a)->int{return a;};  
    //functor仿函数  
    class Functor  
    {  
    public:  
        int operator() (int a)  
        {  
            return a;  
        }  
    };  
    //类的成员函数和类的静态成员函数  
    class CTest  
    {  
    public:  
        int Func(int a)  
        {  
            return a;  
        }  
        static int SFunc(int a)  
        {  
            return a;  
        }  
    };  
    int main(int argc, char* argv[])  
    {  
        //封装普通函数  
        Functional obj = TestFunc;  
        int res = obj(0);  
        cout << "normal function : " << res << endl;  
        //封装lambda表达式  
        obj = lambda;  
        res = obj(1);  
        cout << "lambda expression : " << res << endl;  
        //封装仿函数  
        Functor functorObj;  
        obj = functorObj;  
        res = obj(2);  
        cout << "functor : " << res << endl;  
        //封装类的成员函数和static成员函数  
        CTest t;  
        obj = std::bind(&CTest::Func, &t, std::placeholders::_1);  
        res = obj(3);  
        cout << "member function : " << res << endl;  
        obj = CTest::SFunc;  
        res = obj(4);  
        cout << "static member function : " << res << endl;  
        return 0;  
    }  

运行结果

三、与std::bind的区别

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

  • 将可调用对象和其参数绑定成一个仿函数;
  • 只绑定部分参数,减少可调用对象传入的参数。
 double my_divide(double x, double y) { return x / y; };
 int main(int argc, char* argv[])
 {
	 auto fn_half = std::bind(my_divide, std::placeholders::_1, 2);
	 std::cout << fn_half(10) << '\n';                        // 输出为5
	 return 0;
}

参考:

C++ std::function的用法详解

C++11 中的std::function和std::bind详解

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • windows 下C++生成Dump调试文件与分析

    windows 下C++生成Dump调试文件与分析

    dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草,这篇文章主要介绍了windows 下C++生成Dump调试文件与分析,需要的朋友可以参考下
    2023-04-04
  • C语言数组实现公交车管理系统

    C语言数组实现公交车管理系统

    这篇文章主要介绍了C语言数组实现公交车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Qt实现SqlTableModel映射组件应用小结

    Qt实现SqlTableModel映射组件应用小结

    在Qt中提供了QSqlTableModel模型类,它为开发者提供了一种直观的方式来与数据库表格进行交互,本文就来介绍一下Qt实现SqlTableModel映射组件应用小结,感兴趣的可以了解一下
    2023-12-12
  • C++ 使用CRC32检测内存映像完整性的实现步骤

    C++ 使用CRC32检测内存映像完整性的实现步骤

    当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬盘校验的基础上,增加内存校验,防止动态补丁的运用。
    2021-06-06
  • 一文带你探索C++中类型转换的奥秘

    一文带你探索C++中类型转换的奥秘

    C++ 提供了四种类型转换方式,帮助我们在不同数据类型之间进行有效的数据传递和操作,这些类型转换方式在不同的场景下有各自的优势和适用性,下面我们就来深入了解一下吧
    2023-10-10
  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作

    这篇文章主要介绍了C语言数据结构之栈简单操作的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言深入讲解内存操作问题

    C语言深入讲解内存操作问题

    程序运行的目的是为了得到特定的结果,计算机本质上是用于计算的,既然是用于计算,就需要参与计算的数据,那这些数据就存储在内存中,计算之前参与运算的数据以及运算之后得到的数据,都存储在内存中,所以对内存操作的掌握就尤为重要,下面我们一起来看看
    2022-04-04
  • C++实现AVL树的示例详解

    C++实现AVL树的示例详解

    AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(log_2N),本文主要介绍了AVL树的实现,需要的可以参考一下
    2023-03-03
  • C语言编写基于TCP和UDP协议的Socket通信程序示例

    C语言编写基于TCP和UDP协议的Socket通信程序示例

    这篇文章主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
    2016-03-03
  • MFC LoadImage用法案例详解

    MFC LoadImage用法案例详解

    这篇文章主要介绍了MFC LoadImage用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论