std::bind()

std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的。两个点要明白:

1.绑定全局或者静态函数比绑定成员函数少了个成员变量,且不需要引用如下

//绑定全局函数
    auto pfunc = std::bind(func1, 3);
    //绑定静态函数
    pfunc = std::bind(Func::func6, 3);
    //绑定类成员函数,函数前需要添加引用,多一个变量参数fuc
    Func func;
    pfunc =std::bind(&Func::func2,func, 3);

2.占位符std::placeholders::_1代表此处是要输入参数,且这个参数排在第一位,代码分析更明白

#include <iostream>
    #include <functional>
    using namespace std;
    class Func
    {
    public:
        static void  func6(int numa, int numb, int numc)
        {
            std::cout << numa << " " << numb << " " << numc << endl;
        }
        void func2(int numa, int numb, int numc,std::string name)
        {
            std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
        }
    }
    void callFunc(std::function<void(int a,int b)> call)
     {
         call(1,2);
     }
     void func1(int numa, int numb, int numc)
     {
         std::cout << numa << " " << numb << " " << numc << endl;
     }
    int main()
    {
       callFunc(std::bind(func1, std::placeholders::_1, std::placeholders::_2, 3));
       callFunc(std::bind(func1, std::placeholders::_2, std::placeholders::_1, 3));
       callFunc(std::bind(func1, std::placeholders::_2, 3, std::placeholders::_1));
       callFunc(std::bind(Func::func6, std::placeholders::_1, std::placeholders::_2, 3));
       callFunc(std::bind(&Func::func2, func, std::placeholders::_1, std::placeholders::_2, 3, "name"));
    }

运行结果如下

std::function

std::function等于函数指针,相比函数指针使用更方便,记录一下几种用法:指向全局或者静态函数,类成员函数,Lambda表达式和仿函数。指向全局函数或者静态函数时使用std::function<void()> testFunc = func3,指向类成员函数时,需要制定函数所属的类的成员变量testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name")。代码如下:

#include <iostream>  
    #include <string>
    #include <iostream>
    #include <functional>
    using namespace std;
    class Func
    {
    public:
        int sum;
        Func()
        {
            sum = 2;
        }
        void func2(int numa, int numb, int numc,std::string name)
        {
            std::cout << numa << " " << numb << " " << numc<<" " << name<< endl ;
        }
        void func4()
        {
            std::cout << "func4" << endl;
        }
        void operator() (int a,int b)
        {
            std::cout << "Operator:" << sum<<"  "<<a<<"  "<<b<<endl;
        }
        static void  func6(int numa, int numb, int numc)
        {
            std::cout << numa << " " << numb << " " << numc << endl;
        }
        static void  func5()
        {
            std::cout << "static func" << endl;
        }
    };
     void callFunc(std::function<void(int a,int b)> call)
     {
         call(1,2);
     }
     void func3()
     {
         std::cout <<"func3"<< endl;
     }
     void func1(int numa, int numb, int numc)
     {
         std::cout << numa << " " << numb << " " << numc << endl;
     }
    int main()
    {
        Func func;
        int sum = 10;
        int resultInt = 0;
        //全局或者静态函数
        std::cout << "全局或者静态函数" << endl;
        std::function<void()> testFunc = func3;
        testFunc();
        testFunc = Func::func5;
        testFunc();
        //类成员函数
        std::cout << "类成员函数" << endl;
        testFunc = std::bind(&Func::func2, func, 1, 2, 3, "name");
        testFunc();
        //Lambda表达式
        std::cout << "Lambda表达式" << endl;
        testFunc = [=, &resultInt](){std::cout << sum << endl; resultInt += 100; };
        testFunc();
        cout << "the reslutInt is " << resultInt << endl;
        //仿函数
        std::cout << "仿函数" << endl;
        std::function<void(int a, int b)> abFunc = func;
        abFunc(10, 20);
        std::cout << resultInt << std::endl;
    }

C/C++ C++ 11 std::function和std::bind用法的更多相关文章

  1. C++11 std::function、std::bind和lambda表达式

    参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bin ...

  2. C++11新特性应用--实现延时求值(std::function和std::bind)

    说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. ...

  3. c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...

  4. C++ 中std::function 、std::bind的使用和lambda的使用

    std::function是可调用对象的包装器:std::bind是将可点用对象和其参数一起进行绑定,且绑定后的结果可以使用std::function对象进行保存,并延迟调用到需要调用的时候: 在C+ ...

  5. std::function,std::bind

    std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者 ...

  6. C++11之std::function和std::bind

    std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...

  7. 转 C++11之std::function和std::bind

    std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...

  8. 【浅析C++11】std::function和std::bind

    目录 std::function可调用对象包装器 std::function基本用法 std::function/std::bind与抽象工厂.工厂方法的一点思考 std::function可调用对象 ...

  9. std::function与std::bind 函数指针

    function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时. std::function可以绑定到全局函数/类静态成员 ...

随机推荐

  1. 使用MAC OS X进行PHP开发的一些建议和技巧

    原创作品,允许转载,转载时请务必以超链接形式标明转载自:线筝 本文链接地址: 使用Mac OS X进行PHP开发的一些建议和技巧 用Mac OS X作为开发机已经有一年多的时间了,在这里写下自己的一些 ...

  2. IDEA 服务启动报:No buffer space available (maximum connections reached): connect的解决方案。

    错误提示:严重: Error starting endpointjava.io.IOException: Unable to establish loopback connectionat sun.n ...

  3. PageObject设计模式 在selenium 自动化测试里面的应用

    PageObject设计模式1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 2. web测试时,建议 ...

  4. 不用print调试 xdebug ubuntu phpstorm 远程断点调试

    即使这会写php也遵守zebra大人的指示:不用print调试!!!!----环境ok  ---gan !!! w http://blog.csdn.net/ty_hf/article/details ...

  5. Using Xmanager to connect to remote CentOS 7 via XDMCP

    Gnome in CentOS 7 tries to use local hardware acceleration and this becomes a problem when trying to ...

  6. no suitable ctr exists to convert from 'int' to 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >

    int xfun(int *a,int n) { int x = *a;//a的类型是int *,a+1跳动一个int的长度 ; pa < a + n; pa++)//指向同一个类型的指针比较大 ...

  7. PHP点滴记录

    mysqli_fetch_object() //取得当前行,并作为对象返回 mysqli_fetch_row() //从结果集中取得一行,并作为枚举数组返回 mysqli_fetch_array() ...

  8. Yaconf – 一个高性能的配置管理扩展

    鸟哥出品:http://www.laruence.com/2015/06/12/3051.html 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能 ...

  9. python网络编程中互斥锁与进程之间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  10. SAP选择屏幕开发(一)(转)

    原文链接:https://blog.csdn.net/wtxhai/article/details/90632686 用户通过屏幕操作来实现与SAP的数据交互,而SAP的屏幕开发一般分为两种,一种是通 ...