怎么绑定类的非静态函数,到一个C api回调函数
如何绑定类的非静态函数,到一个C api回调函数?
stl的mem_fun_ref,bind1st,bind2nd是用来绑定类的成员函数(非静态)到algorithm对象的。
但是如果我要绑定的是一个C风格的回调函数(不是ptr_fun转成类函数)的话,不能有this指针的。
例如,我想创建两个线程,每个线程创建的时候都把一个对象和线程联系起来,windows的线程回调函数打印对象的信息。
用stl的functional/mem_fun_ref是不能直接做到的,因为类的成员函数隐含了第一个参数this.
而C风格的回调函数是没有this指针作为第一个参数的。
我该怎么办呢? 我知道有个变通的方法,就是把线程函数声明为静态函数,这样就没有了this.
然后创建线程的时候,把对象指针作为pArg传入CreateThread。线程函数的实现代码,在开始的时候再从lpvoid参数里面把对象指针强转出来。
但是我是想知道,不用上面说的这种变通的方法,C++11的lambda/function功能,能否帮助我实现绑定一个对象到C风格回调函数?
上面这段小代码编译不过,但是表达了我想要做的事情。bind是从一个已经有的函数做Curry化得到一个新的functor,能否帮我实现我的需求?
我从网上看到C++11里面函数已经是第一类型,可以创建到堆上面。我不知道这个功能能否帮上忙,找不到什么资料。
------解决方案--------------------
我想创建两个线程,每个线程创建的时候都把一个对象和线程联系起来,windows的线程回调函数打印对象的信息。
创建线程时,可以传一个32bit的参数,你让它是一个指向你要的对象的指针,不就可以达到目的了吗?
stl的mem_fun_ref,bind1st,bind2nd是用来绑定类的成员函数(非静态)到algorithm对象的。
但是如果我要绑定的是一个C风格的回调函数(不是ptr_fun转成类函数)的话,不能有this指针的。
例如,我想创建两个线程,每个线程创建的时候都把一个对象和线程联系起来,windows的线程回调函数打印对象的信息。
用stl的functional/mem_fun_ref是不能直接做到的,因为类的成员函数隐含了第一个参数this.
而C风格的回调函数是没有this指针作为第一个参数的。
- C/C++ code
#include<windows.h> using std::tr1 struct s{ int i; s(int ii):i(ii){} void WINAPI f(LPVOID pArg){ cout<<"i="<如何绑定类的非静态函数,到一个C回调函数?<i<<endl; } }s1(1),s2(2); void main(){ CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)bind(&(s::f),&s1,placeholders::_1),nullptr,0,nullptr); CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)bind(&(s::f),&s2,placeholders::_1),nullptr,0,nullptr); Sleep(1000); }
我该怎么办呢? 我知道有个变通的方法,就是把线程函数声明为静态函数,这样就没有了this.
然后创建线程的时候,把对象指针作为pArg传入CreateThread。线程函数的实现代码,在开始的时候再从lpvoid参数里面把对象指针强转出来。
但是我是想知道,不用上面说的这种变通的方法,C++11的lambda/function功能,能否帮助我实现绑定一个对象到C风格回调函数?
上面这段小代码编译不过,但是表达了我想要做的事情。bind是从一个已经有的函数做Curry化得到一个新的functor,能否帮我实现我的需求?
我从网上看到C++11里面函数已经是第一类型,可以创建到堆上面。我不知道这个功能能否帮上忙,找不到什么资料。
------解决方案--------------------
我想创建两个线程,每个线程创建的时候都把一个对象和线程联系起来,windows的线程回调函数打印对象的信息。
创建线程时,可以传一个32bit的参数,你让它是一个指向你要的对象的指针,不就可以达到目的了吗?