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. form表单action带参数传递

    form表单action带参数传递function submit(){  var u = document.forms[0].elements["user"].value;  do ...

  2. Mybatis基于注解开启使用二级缓存

    关于Mybatis的一级缓存和二级缓存的概念以及理解可以参照前面文章的介绍.前文连接:https://www.cnblogs.com/hopeofthevillage/p/11427438.html, ...

  3. Mac自带服务器的应用

    Mac OS下自带了apache,方便部署一些静态数据(html,css,js,xml,图片等数据) 一.系统默认路径 系统默认是隐藏apache安装目录的,但我们可以通过“命令行”或者“文件夹前往” ...

  4. TCP概述

    1. TCP提供的服务 我们知道TCP是一个面向连接.提供可靠数据数据传输服务的传输层协议.面向连接意味着发送端和接收端在交换数据前需要建立一个连接,和我们平常打电话一样,在通话前,需要拨号建立连接. ...

  5. python实现堆栈与队列的方法

    python实现堆栈与队列的方法 本文实例讲述了python实现堆栈与队列的方法.分享给大家供大家参考.具体分析如下: 1.python实现堆栈,可先将Stack类写入文件stack.py,在其它程序 ...

  6. Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件

    Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件1.查看jks文件中的entry. keytool -list -keystore server.jks Enter ...

  7. 第 13 章 python并发编程之io模型

    一.IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问 ...

  8. Linux中ssh及scp的连接

    1. 当你想获取另外一台电脑上的数据时,可以使用这个命令 scp -P 10022 root@172.30.83.173:~/ubuntu1.tar ./ -r   代表传输文件夹,直接传文件可以不加 ...

  9. php优化方法

    代码优化是开发程序和网站必不可少的一步,代码优化好了,可以大大增加程序的运行效率.使网站或程序加载反应更快.用户体验也就会更好.下面就为大家总结了50条PHP代码优化技巧. 1. 用单引号代替双引号来 ...

  10. centos7系统乱码问题解决

    操作步骤: 查看当前系统的默认语言 echo $LANG 查看系统支持的语言库 locale 如果没有要设置的语言需要安装一下 yum groupinstall chinese-support -y ...