聊一聊C++bind函数使用

开发 后端
短短的一行代码,实际上考验了一个人对C++的掌握深度,好了话不多说,进入今天的介绍,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函数是如何使用的呢?

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

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

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

绑定一个成员函数:

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

  1. class Speaker { 
  2. public 
  3.     Speaker(); 
  4.     ~Speaker() 
  5.     { 
  6.         speaker_play_routine_->join(); 
  7.     } 
  8.     void playRoutine() 
  9.     { 
  10.     } 
  11. private 
  12.     boost::thread* speaker_play_routine_{nullptr}; 
  13. }; 
  14. int main() 
  15.    speaker_play_routine_ = new boost::thread(boost::bind(&Speaker::playRoutine, this)); 
  16.  } 

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

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

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

本文转载自微信公众号「羽林君」,可以通过以下二维码关注。转载本文请联系羽林君公众号。

 

责任编辑:武晓燕 来源: 羽林君
相关推荐

2021-02-06 08:34:49

函数memoize文档

2020-11-10 07:46:58

函数printf 数据

2020-10-30 07:11:31

C 语言编程

2022-08-30 07:39:57

C++namespace隔离

2022-05-18 16:35:43

Redis内存运维

2023-09-22 17:36:37

2021-01-28 22:31:33

分组密码算法

2020-05-22 08:16:07

PONGPONXG-PON

2021-08-29 18:34:44

编译V8C++

2018-06-07 13:17:12

契约测试单元测试API测试

2021-03-29 00:02:10

C#Attribute元素

2022-08-08 08:25:21

Javajar 文件

2021-01-29 08:32:21

数据结构数组

2021-08-04 09:32:05

Typescript 技巧Partial

2023-05-15 08:38:58

模板方法模式

2018-11-29 09:13:47

CPU中断控制器

2019-02-13 14:15:59

Linux版本Fedora

2023-07-06 13:56:14

微软Skype

2022-11-01 08:46:20

责任链模式对象

2020-10-15 06:56:51

MySQL排序
点赞
收藏

51CTO技术栈公众号