• C++11 bind


    #include <iostream>
    #include <functional>
    using namespace std;
    
    int func(int a, int b)
    {
        return a + b;
    }
    
    
    class foo
    {
    public:
        int func(int a, int b)
        {
            return a + b;
        }
    };
    
    int main()
    {
        auto bf1 = std::bind(func, 10, std::placeholders::_1);
        cout<<bf1(20)<<endl;
    
        foo f;
        auto bf2 = std::bind(&foo::func, f, std::placeholders::_1, std::placeholders::_2);
        cout<<bf2(100, 50)<<endl;
    
        std::function<int (int)> bf3 = std::bind(&foo::func, f, std::placeholders::_1, 100);
        cout<<bf3(100)<<endl;
    
        return 0;
    }

    bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。

    例子中:bf1是把一个两个参数普通函数的第一个参数绑定为10,生成了一个新的一个参数的可调用实体体; bf2是把一个类成员函数绑定了类对象,生成了一个像普通函数一样的新的可调用实体; bf3是把类成员函数绑定了类对象和第二个参数,生成了一个新的std::function对象。看懂了上面的例子,下面我们来说说使用bind需要注意的一些事项:

    • (1)bind预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的
    • (2)对于不事先绑定的参数,需要传std::placeholders进去,从_1开始,依次递增。placeholder是pass-by-reference的
    • (3)bind的返回值是可调用实体,可以直接赋给std::function对象
    • (4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前,这些参数是可用的
    • (5)类的this可以通过对象或者指针来绑定
  • 相关阅读:
    mac idea 更换主题
    记一次Sonarqube踩坑实录
    Mysql 常用数据类型
    Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈
    git clone克隆github仓库慢,问题解决
    SpringBoot 解决跨域问题
    Android 中的敏感信息泄露
    Drozer 测试 APP
    Drozer 安装踩坑日记
    安卓测试笔记--工具安装
  • 原文地址:https://www.cnblogs.com/kex1n/p/7072134.html
Copyright © 2020-2023  润新知