zoukankan      html  css  js  c++  java
  • 关于c++种std::function和bind的用法

    一、C++中的函数种类(包括c++11中的)
    二、bind和function存在的意义
    三、Bind的使用方法
    四、Function的使用方法

    Hello,各位看官,最近我研究了c++中的bind的使用情况(因为我的编译环境基本上就是在c++11中,所以bind1st和bind2nd就不研究了),顺便我们简单的来说一说std::function的使用方法。

    一、C++中的函数种类
    C++中的函数种类一共可以分成以下几种,首先是C语言普通函数(就是不在类里边的函数),第二种就是Lamada表达式,第三种就是类中的普通函数,最后一种就是类中的静态函数。我们可以简单的写一下这四个函数
    // C语言普通函数
    int funcAdd(int a, int b)
    {
    return a + b;
    }
    // Lamada表达式
    auto lamabaAdd = [](int a, int b)->int {
    return a + b;
    };
    // 类中的普通函数和静态函数
    class A {
    private:
    int m_num;
    public:
    A(int num) : m_num(num) {}
    int classAdd(int a, int b) {
    return a + b;
    }

    static int staticAdd(int a, int b) {
    return a + b;
    }
    };

    二、Bind函数和function函数的意义
    首先,我个人觉得bind函数和std::function函数所表达的意思差不多,就是把上面四种形式转换成一个形式。其二,有些函数参数当中需要使用bind函数。
    三、bind的使用方法
    我们仍旧以上面四个例子为例:
    // C语言普通函数绑定成bind
    auto bindCommon = std::bind(funcAdd, std::placeholders::_1, std::placeholders::_2);
    int result = bindCommon(1, 2);
    std::cout<<"commonresult is:"<<result<<std::endl;
    auto bindCommon1 = std::bind(funcAdd, 2, 2);
    result = bindCommon1();
    std::cout<<"bindcommonresult is:"<<result<<std::endl;
    我们看到,bind函数当中有两种表示方法,第一种就是不赋值,第二种就是指定值,那么如果不指定具体的值该怎么做呢?使用std::placeholders来进行占位,这个参数最多可以写9个。第二种就是指定相对应的值,比如上表达是种的2,2,这样,下面就不用再赋值了。
    // Lamada表达式绑定成bind
    auto bindLamadaAdd = std::bind(lamabaAdd, std::placeholders::_1, std::placeholders::_2);
    result = bindLamadaAdd(3, 2);
    std::cout<<"bindlamadaresult is:"<<result<<std::endl;
    auto bindLamadaAdd1 = std::bind(lamabaAdd, 4, 2);
    result = bindLamadaAdd1();
    std::cout<<"bindLamadaresult is:"<<result<<std::endl;
    A aa(10);
    与C语言普通函数一样,也是有两种方法,这里就不多废话了。
    // 类中普通函数的表示方法
    A aa(10);
    auto bindClassAdd = std::bind(&A::classAdd, aa, std::placeholders::_1, std::placeholders::_2);
    result = bindClassAdd(5, 2);
    std::cout<<"bindClassAddresult is"<<result<<std::endl;
    auto bindClassAdd1 = std::bind(&A::classAdd, aa, 6, 2);
    result = bindClassAdd1(6, 2);
    类中的稍有不同,区别就是必须指定谁调用bind的表达式,以这个公式为例,aa.*(classAdd(6,2)),这样一种形式,用this指针亦可。
    // 类中静态函数的表示方法
    auto bindStaticAdd = std::bind(&A::staticAdd, std::placeholders::_1, std::placeholders::_2);
    result = bindStaticAdd(7, 2);
    std::cout<<"bindStaticAddResult is"<<result<<std::endl;
    auto bindStaticAdd1 = std::bind(&A::staticAdd, 8, 2);
    result = bindStaticAdd1();
    std::cout<<"bindStaticAddResult1 is"<<result<<std::endl;
    这个和C语言普通函数一样,就不多说了。

    四、function的用法
    Function的用法与bind基本一致,这里举一个例子。
    std::function<int(int, int)> func;
    func = funcAdd;
    int result1 = func(6, 7);
    这样就可以了。

  • 相关阅读:
    【转】深入分析事务的隔离级别
    gluoncv 用已经训练好的模型参数,检测物体
    gluoncv 目标检测,训练自己的数据集
    SMB linux&windows共享文件
    VOC 数据集
    yaml 配置文件
    SSD 单发多框检测
    目标检测数据集(皮卡丘)
    zip 函数
    输出预测边界框,NMS非极大值抑制
  • 原文地址:https://www.cnblogs.com/songyuchen/p/14437288.html
Copyright © 2011-2022 走看看