zoukankan      html  css  js  c++  java
  • c++bind函数使用

    总述

        最近写代码的时候看到代码使用了bind,一个参数绑定的标准库函数。程序是这么写的, speaker_play_routine_ = new boost::thread

    (boost::bind(&Speaker::playRoutine, this)); 这是我们一个语音播放的一行代码。

        其中 boost::thread是新建一个线程,线程执行函数是Speaker::playRoutine,执行函数被bind绑定函数可以修改普通函数来构造bind对象,bind函数的第二个参数是this(this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员)是Speaker::playRoutine类函数的参数。

        短短的一行代码,实际上考验了一个人对C++的掌握深度,好了话不多说,进入今天的介绍,c++ bind绑定函数。

    作者:良知犹存

    转载授权以及围观:欢迎添加微信公众号:羽林君

    1 使用由来

     

        我们看到我使用的代码是boost :: bind,而大家在网上看到的大部分介绍是标准函数std :: bind,其实boost :: bind是标准函数std :: bind1st和std :: bind2nd的泛化。它支持任意函数对象,函数,函数指针和成员函数指针,并且能够将任何参数绑定到特定值或将输入参数路由到任意位置。bind对函数对象没有任何要求; 特别地,它不需要result_type,first_argument_type和second_argument_type标准typedef。

    2 使用介绍

     

       通常我们可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。bind可以根据当前已有的可调用对象,构造出一个新的可调用对象,有了bind,我们可以实现“动态生成新的函数”的功能。简而言之,就是可以通过bind函数修改原函数并生成一个可以被调用的对象,类似于函数的重载,但是我们又不需要去重新写一个函数,用bind函数就可以实现。

    接下来我们看看bind函数是如何使用的呢?

    绑定一个普通函数和函数指针:

    int fun(int a, int b,int c,int d,int e)
    {
        return a + b - c + d - e;
    }
    
    
    int main()
    {
      int x=1,y=2,z=3;
      auto g =bind(fun,x,y,_2,z,_1);
    }
    

     

    这样的g 是一个有两个参数的可调用对象,它的两个参数分别用占位符_2 和_1表示。这个新的可调用对象将它自己的参数作为第三个和第五个传递给fun,fun函数的第一个、第二个第四个参数分别被绑定到给定的值x、y、z上。

    绑定一个成员函数:

    bind最常用的功能之一,是由类成员函数构造bind对象;想想看,如何由类成员函数(非static成员函数)构造回调函数?答案是很难,而通过bind,却可以很容易做到。

    class Speaker {
    public
        Speaker();
        ~Speaker()
        {
            speaker_play_routine_->join();
        }
        void playRoutine()
        {
        }
    private
        boost::thread* speaker_play_routine_{nullptr};
    };
    int main()
    {
       speaker_play_routine_ = new boost::thread(boost::bind(&Speaker::playRoutine, this));
     }
    

        

        这里类的成员函数必须通过类的对象或者指针调用,因此在绑定时,bind要拿出第一个参数的位置来指定一个类的实例、指针或者引用。

    注意:必须在成员函数前面加上取地址的操作符&。

    参考文章:https://www.boost.org/doc/libs/1_65_1/libs/bind/doc/html/bind.html#bind.purpose.using_bind_with_functions_and_fu

     这就是我分享的bind函数,写的也比较简单,如果大家有什么更好的思路,欢迎分享交流哈。

  • 相关阅读:
    spring in action小结4.1
    spring in action小结3 运行时值注入
    python-__init__.py 与模块对象的关系
    Python-常用库扩展
    Qt-优化布局结构
    Python-文件修改器
    C语言-数据结构(一)
    Python-PyQt4学习笔记
    Python-PyQt4学习资料汇总
    Linux-查看C语言手册及man的特殊用法
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/13862739.html
Copyright © 2011-2022 走看看