c++std::funciona代替函数指针——结合std::bind-创新互联

一、介绍std::function

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

阳东网站建设公司创新互联,阳东网站设计制作,有大型网站制作公司丰富经验。已为阳东近1000家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的阳东做网站的公司定做!
typedef  void(*ptr)(int,int)// 这里的ptr就是一个函数指针

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

std::functionfunc;

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

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

二、与std::bind结合

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

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

  • 将可调用对象和其参数绑定成一个仿函数;
  • 只绑定部分参数,减少可调用对象传入的参数。

1、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;
}

2、std::bind绑定一个成员函数

struct Foo {
    void print_sum(int n1, int n2)
    {
        std::cout<< n1+n2<< '\n';
    }
    int data = 10;
};
int main() 
{
    Foo foo;
    auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1);
    f(5); // 100
}
三、实例
#include#include#include#include#include#include#include   
    #include#includeusing namespace std;  
    //声明一个模板  
    typedef std::functionFunctional;  
    //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::function 就是函数的容器。比传统的函数指针功能更强大,配合上bind能够解决成员函数指针跟随类的弊端

弊端可参考如下:

【C++】std::function与函数指针_芒果黑的博客-博客_c++ function 转函数指针

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:c++std::funciona代替函数指针——结合std::bind-创新互联
链接URL:http://bzwzjz.com/article/dsssej.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 网站设计公司 重庆电商网站建设 公司网站建设 成都营销网站制作 成都网站设计 成都网站建设 高端网站设计推广 企业网站设计 商城网站建设 成都响应式网站建设 达州网站设计 网站设计 营销型网站建设 成都网站建设 重庆网站制作 成都网站建设 自适应网站设计 响应式网站设计 企业手机网站建设 网站制作公司 成都网站建设 重庆外贸网站建设