博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ std::function 和 std::bind
阅读量:6801 次
发布时间:2019-06-26

本文共 2588 字,大约阅读时间需要 8 分钟。

hot3.png

    C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于回调,抽象,以及延迟调用等多种场景。

    1,std::function

        std::function模板定义了多种构造函数,常用如下几个构造函数:

        (1)默认构造函数 function():构造一个空的function。

        (2)function(  ):同样,构造一个空的function。

        (3)function( const function& other ):拷贝构造函数。

        (4)function( function&& other ):移动构造函数。

        (5)template< class F > function( F f ):用可调用对象 f 初始化function对象。

    std::function 示例如下:

#include <functional>

#include <iostream>

void dump(int a) {

    std::cout << "General: " << " a=" << a << std::endl;
}

class Func {

public:
    Func() {}
    ~Func() {}

    static void print(int a) {

        std::cout << "Static print: " << "a=" << a << std::endl;
    }

    void dump(int a) {

        std::cout << "MemberFunction: " << " a=" << a << std::endl;
    }

    void operator()(int a) {

        std::cout << "Functor: " << " a=" << a << std::endl;
    }

};

int main() {

    std::function<void(int)> cb1 = dump;    // 使用普通函数初始化 function
    cb1(10);

    std::function<void(int)> cb2 = cb1;    // 拷贝构造函数初始化function

    cb2(20);

    std::function<void(int)> cb3 = [](int a)->void{std::cout << "Lambda: a=" << a << std::endl;};    // 移动构造函数,使用lambda初始化

    cb3(30);

    std::function<void(int)> cb4 = Func::print;    // 使用类的静态成员函数初始化

    cb4(40);

    Func func;

    std::function<void(Func &, int)> cb5 = &Func::dump;    // 使用类的非静态成员函数初始化
    cb5(func, 50);

    std::function<void(int)> cb6 = func;    //  使用仿函数初始化

    cb6(60);

    return 0;

}
 

    2,std::bind

    std::bind用来将可调用对象跟参数绑定到一起,返回std::function类型的对象,从而延迟到需要的时候进行调用。std::bind绑定的可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。

    示例如下:

#include <functional>

#include <iostream>

void dump(int a, int b, int c) {

    std::cout << "General: " << " a=" << a << std::endl;
    std::cout << "General: " << " b=" << b << std::endl;
    std::cout << "General: " << " c=" << c << std::endl;
}

int main() {

    // 可调用对象dump三个参数全部通过 function传入

    std::function<void(int, int, int)> cb1 = std::bind(dump, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
    cb1(1, 2, 3);

    // 绑定可调用对象dump的第一,第三个参数分别为1,3,透传function的参数给dump的第二个参数,打印 1 2 3

    std::function<void(int)> cb2 = std::bind(dump, 1, std::placeholders::_1, 3);

    cb2(2);

    // bind通过std::placeholders::_n调整参数顺序,打印 3 2 1

    std::function<void(int, int, int)> cb3 = std::bind(dump, std::placeholders::_3, std::placeholders::_2, std::placeholders::_1);

    cb3(1, 2, 3);

    return 0;

}
    3,std::placeholders

        std::bind通过std::placeholders保存未绑定的参数,std::placeholders::_1表示std::function对象的第一个参数,std::placeholders::_2表示std::function对象的第二个参数,... 以此类推,std::placeholders::_n表示std::function对象的第n个参数。这些参数按照在bind中的定义顺序传递,从而可以达到调整参数顺序的目的。因此,bind相当于一个中介,可以透传参数,可以调整参数顺序,也可以定义默认参数,使得调用参数个数少于实际可调用对象的参数。

    

转载于:https://my.oschina.net/yepanl/blog/2206900

你可能感兴趣的文章
用C#修改系统区域和语言设置
查看>>
如何使用Flexbox和CSS Grid,实现高效布局
查看>>
即将搭载人工智能芯片的华为Mate10,究竟会为业界带来什么?
查看>>
Linux在应用层读写寄存器的方法。。。
查看>>
区分execl与system——应用程序中执行命令
查看>>
Android实现登录小demo
查看>>
AgentWeb是基于Android WebView一个功能完善小型浏览器库
查看>>
电商网站的支付接入该怎么做呢
查看>>
5G超密集组网驱动光模块市场爆发
查看>>
Openstack组件部署 — Overview和前期环境准备
查看>>
开放数据中心联盟推8个云计算应用模型
查看>>
学习数据分析的“里程碑”是什么?
查看>>
零点之战!探访阿里巴巴8大技术专家,提前揭秘2017双11关键技术
查看>>
国家开发银行统一软件环境USE解决方案
查看>>
数据科学与DevOps之间的差距还有救吗?
查看>>
程序员必须知道的10大基础实用算法及其讲解
查看>>
信息化一周回顾:金融业大数据十大趋势
查看>>
Http、TCP/IP协议与Socket之间的区别
查看>>
ARM工控主板在驾考驾培智能终端的使用
查看>>
大数据开启“互联网+统计”新模式
查看>>