免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3805 | 回复: 1
打印 上一主题 下一主题

如何绑定类的非静态函数,到一个C回调函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-15 19:43 |只看该作者 |倒序浏览
10可用积分
本帖最后由 moonsister02 于 2012-04-15 19:44 编辑

如何绑定类的非静态函数,到一个C回调函数?

stl的mem_fun_ref,bind1st,bind2nd是用来绑定类的成员函数(非静态)到algorithm对象的。
但是如果我要绑定的是一个C风格的回调函数(不是ptr_fun转成类函数)的话,不能有this指针的。

例如,我想创建两个线程,每个线程创建的时候都把一个对象和线程联系起来,windows的线程回调函数打印对象的信息。
用stl的functional/mem_fun_ref是不能直接做到的,因为类的成员函数隐含了第一个参数this.
而C风格的回调函数是没有this指针作为第一个参数的。

  1. #include<windows.h>
  2. using std::tr1
  3. struct s{
  4.         int i;
  5.         s(int ii):i(ii){}
  6.         void WINAPI f(LPVOID pArg){
  7.                 cout<<"i="<<i<<endl;
  8.         }
  9. }s1(1),s2(2);
  10. void main(){
  11.         CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)bind(&(s::f),&s1,placeholders::_1),nullptr,0,nullptr);
  12.         CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)bind(&(s::f),&s2,placeholders::_1),nullptr,0,nullptr);
  13.         Sleep(1000);
  14. }
复制代码
我该怎么办呢? 我知道有个变通的方法,就是把线程函数声明为静态函数,这样就没有了this.
然后创建线程的时候,把对象指针作为pArg传入CreateThread。线程函数的实现代码,在开始的时候再从lpvoid参数里面把对象指针强转出来。

但是我是想知道,不用上面说的这种变通的方法,C++11的lambda/function功能,能否帮助我实现绑定一个对象到C风格回调函数?
上面这段小代码编译不过,但是表达了我想要做的事情。bind是从一个已经有的函数做Curry化得到一个新的functor,能否帮我实现我的需求?

我从网上看到C++11里面函数已经是第一类型,可以创建到堆上面。我不知道这个功能能否帮上忙,找不到什么资料。

最佳答案

查看完整内容

CreateThread/pthread_create需要的是函数指针,但无论是lambda expression还是bind,都没法直接转换成函数指针。你说的变通方法其实是很正规的方法……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2012-04-15 19:43 |只看该作者
CreateThread/pthread_create需要的是函数指针,但无论是lambda expression还是bind,都没法直接转换成函数指针。
你说的变通方法其实是很正规的方法……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP