• Bind函数详解


    自己开发了一个股票软件,功能很强大,需要的点击下面的链接获取:

    https://www.cnblogs.com/bclshuai/p/11380657.html

    Bind函数详解

    目录

    1       简介... 1

    2       使用实例... 1

    2.1      bind函数常规使用... 1

    2.2      bind函数和thread线程函数... 3

    3       原理解析... 4

    3.1      一般函数绑定... 4

    3.2      成员函数绑定... 5

    3.3      Bind函数如何改变入参的顺序... 5

    1         简介

    bind函数的作用是通过绑定一个其他func函数生成一个依赖于func的新的函数对象,复用func函数的实现,但是可以改变这个func的参数数量和顺序,可以绑定普通函数、全局函数,静态函数,成员函数,而且其参数可以支持占位符(std::placeholders::_1,std::placeholders::_2)来改变参数的顺序,并且可以设置func中默认的几个参数来减少输入参数的数量。

    2         使用实例

    2.1   bind函数常规使用

    // BindTest.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <functional>
    #include <iostream>
    using namespace std;
    int add(int a, int b)
    {
        printf("normal function:%d+%d=",a,b );
        return a + b;
    }
    class addClass
    {
    public:
        int add(int a, int b)
        {
            printf("member function:%d+%d=", a, b);
            return a + b;
        };
        int extraAdd(int a, int b)
        {
            //printf("member extraAdd function:%d+%d=", a, b);
            auto classpointadd = std::bind(&addClass::add, this,a,b);
            return classpointadd();
        };
    };
    int main()
    {    //绑定静态函数
        auto fadd = std::bind(add, std::placeholders::_1, 4);
        cout<<fadd(2) << endl;
        //绑定成员函数,第一个参数需要是对象
        addClass addobject;
        auto classadd = std::bind(&addClass::add, addobject, std::placeholders::_1, 3);
        cout <<classadd(2) << endl;
        //绑定成员函数,第一个参数也可以是指针
        auto classpointadd = std::bind(&addClass::add, &addobject, std::placeholders::_1, 2);
        cout << classpointadd(2) << endl;
        //也可以在类的成员函数内部绑定成员函数,并且传递this指针
        cout << addobject.extraAdd(1, 4) << endl;
        //占位符改变参数顺序
        auto changeOrder= std::bind(&addClass::add, addobject, std::placeholders::_2, std::placeholders::_1);
        cout << changeOrder(1,2) << endl;//输入参数1,2,在add中参数变成2,1.
        getchar();
        return 0;
    }

    输出结果

     

    2.2   bind函数和thread线程函数

    // BindTest.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <functional>
    #include <iostream>
    #include <thread>
    using namespace std;
    class threadBind
    {
    public:
        void StartThread()
        {
            m_ReconnectThread = std::move(thread(std::bind(&threadBind::Reconnect, this)));
        }
        void Reconnect() {
            while (true)
            {
                //do reconnect
                printf("thread func run\n");
                break;
            }
        };
    private:
        std::thread m_ReconnectThread;
    };
        
    int main()
    {    
        //线程函数绑定
        threadBind thr;
        thr.StartThread();
        getchar();
        return 0;
    }

    输出结果

     

    3         原理解析

    3.1   一般函数绑定

    Bind函数绑定函数时,会创建一个新的操作对象,对象内部有指向函数的指针和参数变量保存默认的参数。

     

    3.2   成员函数绑定

    绑定成员函数时,需要传入对象的指针,不然bind找不到是调用哪个对象的成员函数。

     

    3.3   Bind函数如何改变入参的顺序

    参数输入函数时,默认是从左到右的顺序,通过bind和占位符的顺序,可以改变输入参数的输入顺序。

    //占位符改变参数顺序

        auto changeOrder= std::bind(&addClass::add, addobject, std::placeholders::_2, std::placeholders::_1);

     

     参考文献

    https://www.cnblogs.com/xusd-null/p/3698969.html

    https://www.cnblogs.com/jerry-fuyi/p/12633621.html

    https://blog.csdn.net/u013654125/article/details/100140328

     
    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html
  • 相关阅读:
    设计模式-可复用面向对象软件基础笔记
    C#--笔记
    win系统下nodejs安装及环境配置
    三步将Node应用部署到Heroku上 --转载
    Ubuntu 重启命令
    Ubuntu ssh免密登录
    Ubuntu Hadoop环境搭建(Hadoop2.6.5+jdk1.8.0_121)
    Ubuntu vim使用
    Scala学习——array与arraybuffer的区别(初)
    Scala学习——可变参数(初)
  • 原文地址:https://www.cnblogs.com/bclshuai/p/15802407.html
Copyright © 2020-2023  润新知