मैंने इसे C ++ में एक प्लगइन थ्रेड पूल बनाने के लिए लंबे समय पहले इस्तेमाल किया था; चूंकि फ़ंक्शन तीन पैरामीटर ले रहा था आप इस तरह से लिख सकते हैं
मान लीजिए कि आपके तरीके पर हस्ताक्षर हैं:
int CTask::ThreeParameterTask(int par1, int par2, int par3)
तीन मापदंडों को बांधने के लिए एक फ़ंक्शन ऑब्जेक्ट बनाने के लिए आप इस तरह से कर सकते हैं
// a template class for converting a member function of the type int function(int,int,int)
//to be called as a function object
template<typename _Ret,typename _Class,typename _arg1,typename _arg2,typename _arg3>
class mem_fun3_t
{
public:
explicit mem_fun3_t(_Ret (_Class::*_Pm)(_arg1,_arg2,_arg3))
:m_Ptr(_Pm) //okay here we store the member function pointer for later use
{}
//this operator call comes from the bind method
_Ret operator()(_Class *_P, _arg1 arg1, _arg2 arg2, _arg3 arg3) const
{
return ((_P->*m_Ptr)(arg1,arg2,arg3));
}
private:
_Ret (_Class::*m_Ptr)(_arg1,_arg2,_arg3);// method pointer signature
};
अब, मापदंडों को बांधने के लिए, हमें एक बाइंडर फ़ंक्शन लिखना होगा। तो, यहाँ यह जाता है:
template<typename _Func,typename _Ptr,typename _arg1,typename _arg2,typename _arg3>
class binder3
{
public:
//This is the constructor that does the binding part
binder3(_Func fn,_Ptr ptr,_arg1 i,_arg2 j,_arg3 k)
:m_ptr(ptr),m_fn(fn),m1(i),m2(j),m3(k){}
//and this is the function object
void operator()() const
{
m_fn(m_ptr,m1,m2,m3);//that calls the operator
}
private:
_Ptr m_ptr;
_Func m_fn;
_arg1 m1; _arg2 m2; _arg3 m3;
};
और, binder3 वर्ग का उपयोग करने के लिए एक सहायक कार्य - bind3:
//a helper function to call binder3
template <typename _Func, typename _P1,typename _arg1,typename _arg2,typename _arg3>
binder3<_Func, _P1, _arg1, _arg2, _arg3> bind3(_Func func, _P1 p1,_arg1 i,_arg2 j,_arg3 k)
{
return binder3<_Func, _P1, _arg1, _arg2, _arg3> (func, p1,i,j,k);
}
और यहां हमें इसे कॉल करने का तरीका बताया गया है
F3 f3 = PluginThreadPool::bind3( PluginThreadPool::mem_fun3(
&CTask::ThreeParameterTask), task1,2122,23 );
नोट: f3 (); टास्क 1 को कॉल करेगा-> थ्रीपैरमीटरटैस्क (21,22,23);
अधिक जानकारी के लिए -> http://www.codeproject.com/Articles/26078/AC-Plug-in-Treadread-ool-Design
myThread=boost::thread(boost::bind(&MyClass::threadMain, this))