2009-06-25 11 views
11

मेरे पास एक-आयामी फ़ंक्शन मिनीमाइज़र है। अभी मैं इसे फ़ंक्शन पॉइंटर्स पास कर रहा हूं। हालांकि कई कार्यों में कई पैरामीटर होते हैं, जिनमें से कुछ निश्चित होते हैं। मैंने इसेआप बूस्ट :: बाध्य ऑब्जेक्ट्स को फ़ंक्शन में कैसे पास करते हैं?

template <class T> 
minimize(T &f) { 
} 

Functor f(param1, param2); 
minimize<Functor>(f); 

हालांकि मज़ेदार परिभाषा के बहुत सारे क्रूड हैं। बूस्ट :: बाइंड क्लीनर दिखता है। तो यह है कि मैं कर सकता है:

minimize(boost:bind(f,_1,param1,param2)) 

हालांकि मैं स्पष्ट नहीं कर रहा हूँ मेरी minimize घोषणा boost::bind का उपयोग कर की तरह की तरह होना चाहिए कि। boost::bind किस प्रकार का ऑब्जेक्ट है? क्या इसके लिए कोई आसान पैटर्न है जो मकसद के बॉयलरप्लेट से बचाता है लेकिन एकाधिक पैरामीटर बाध्यकारी की अनुमति देता है?

उत्तर

17

आप केवल boost::function का उपयोग कर सकते हैं। मुझे लगता है कि boost::bind का अपना रिटर्न प्रकार है, लेकिन यह boost::function के साथ संगत है। विशिष्ट उपयोग समारोह के लिए एक typedef बनाना है:

typedef boost::function<bool(std::string)> MyTestFunction; 

और फिर आप boost::bind के साथ किसी भी संगत समारोह पारित कर सकते हैं:

bool SomeFunction(int i, std::string s) { return true; } 
MyTestFunction f = boost::bind(SomeFunction, 42, _1); 
f("and then call it."); 

मुझे आशा है कि आप क्या चाहते हैं।

यह पर दूसरे पैरामीटर के रूप में कॉल के लिए this पॉइंटर को पारित करके विधियों के साथ भी काम करता है।

4

मैं कम से कम परिभाषित करेगा() इस तरह:

minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f) 
{ 
    ... 
} 

तो फिर तुम फोन को कम कर सकता है() इस तरह:

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...)); 
3

बदलें एक मूल्य के पैरामीटर के लिए पैरामीटर। फंक्शन ऑब्जेक्ट्स जानबूझकर हल्के वजन होते हैं, और boost::bind निश्चित रूप से boost::compressed_pair का उपयोग करके कुछ बाइट्स के स्थान के भीतर फिट करने के लिए विशेष रूप से तैयार किए जाते हैं और क्या नहीं।

template <class T> 
void minimize(T f) { 
} 

फिर आप इसे boost::bind का परिणाम पास कर सकते हैं। याद रखें कि boost::bind वास्तव में एक फ़ंक्शन टेम्पलेट है जो किसी प्रकार का कुछ ऑब्जेक्ट देता है। तो minimize होने पर एक गैर-कॉन्स्ट संदर्भ पैरामीटर काम नहीं कर सका।

1

सबसे पहले, आप अपने टेम्पलेट तर्क को एक रेफ-टू-गैर-कॉन्स के रूप में ले रहे हैं, इसलिए बूस्ट :: बाइंड द्वारा अस्थायी returend इसे बाध्य नहीं करेगा। तो आप इसे पसंद का उपयोग कर सकते हैं:

template <class T> 
T::result_type minimize(const T &f) { 
} 

लेकिन अगर आप अपने functors के साथ इस प्रयोग करना चाहते थे, वे एक स्थिरांक ऑपरेटर है करने के लिए होगा()। तो शायद मान द्वारा बेहतर है:

template <class T> 
T::result_type minimize(T f) { 
} 

मैं वापसी टी :: RESULT_TYPE एक बढ़ावा :: समारोह (बल्कि जटिल प्रकार बाँध रिटर्न की तुलना में) होने के लिए एक टी के लिए बाध्य करेगा होना होने विश्वास है, लेकिन मैं नहीं कर रहा हूँ 100%