c++ 之bind使用

网络编程中, 经常要使用到回调函数。 当底层的网络框架有数据过来时,往往通过回调函数来通知业务层。 这样可以使网络层只专注于 数据的收发, 而不必关心业务

在c语言中, 回调函数的实现往往通过函数指针来实现。 但是在c++中 , 如果回调函数是一个类的成员函数。这时想把成员函数设置给一个回调函数指针往往是不行的

因为类的成员函数,多了一个隐含的参数this。 所以直接赋值给函数指针肯定会引起编译报错

c++11 为我们带来了bind, 可以很好的解决这个问题

#include <functional>
std::bind(待绑定的函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2,...,参数绑定值n);
#include <functional>
#include <iostream>
using namespace std::placeholders;
using namespace std;

class  test{
public:  
      int i = 0;
      void incr(int j){ i+=j;}
};

void sample(){
     test *p =new test();
     
     auto f0=bind(&test::incr,p,_1);
     f0(2);     
     cout<<p->i<<endl;
         
}

  要注意的是bind()函数 返回的是一个function 类型的对象, 并不能简单地赋值给c语言中定义的函数指针。

例如上面的例子中,我们使用auto 直接推导了变量类型。如果要显示指定变量类型

typedef void(*func)(int);

func f1 =  bind(&test::incr,p,_1);

这样是编译不过的, 必须写成function类型

typedef function<void()> func;

func f1 =  bind(&test::incr,p,_1);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

命令执行漏洞简单讲述

如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞

1574
来自专栏枕边书

搭建自己的PHP框架心得(三)

续言 接着完善自己的PHP框架,本次更新的主要内容有: 介绍了异常处理机制 完善了异常和错误处理 数据表跟Model类的映射 异常处理 异常处理:异常处理是编程...

2546
来自专栏linux系统运维

正则介绍以及grep

1303
来自专栏L宝宝聊IT

Shell脚本应用(if语句的结构)

1445
来自专栏coding for love

JS入门难点解析5-变量对象

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

1164
来自专栏海天一树

小朋友学C语言(30):局部变量和全局变量

(一)局部变量 在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在...

3758
来自专栏java一日一条

java中“==”和equal区别

8个月以后就要正式找工作啦,我觉得现在是时候花时间好好深入研究一下以前比较混肴的知识。这就当作是自我成长的第一步!

691
来自专栏小勇DW3

类加载过程中几个重点执行顺序整理

1、 JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

3272
来自专栏Python爬虫与数据挖掘

一篇文章助你理解Python2中字符串编码问题

前几天给大家介绍了unicode编码和utf-8编码的理论知识,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系。下面在Pyt...

913
来自专栏申龙斌的程序人生

零基础学编程007:FOR循环

在上篇文章《赋值语句》之后,已经可以输出这个枯燥的《复利数据表》的任意一行数据了,例如用这两条语句: i = 100 print( "(1+0.01) ^", ...

3037

扫码关注云+社区

领取腾讯云代金券