2010-04-14 11 views
7

मान लीजिए निम्न दो कार्य:सी ++: बांधों का संयोजन?

#include <iostream> 
#include <cstdlib> // atoi 
#include <cstring> // strcmp 
#include <boost/bind.hpp> 

bool match1(const char* a, const char* b) { 
    return (strcmp(a, b) == 0); 
} 

bool match2(int a, const char* b) { 
    return (atoi(b) == a); 
} 

इन कार्यों में से प्रत्येक दो तर्क लेता है, लेकिन एक प्रतिदेय उद्देश्य यह है कि (एसटीडी/बढ़ावा) bind का उपयोग करके केवल एक तर्क लेता में तब्दील किया जा सकता है।

boost::bind(match1, "a test"); 
boost::bind(match2, 42); 

मैं इन कि एक तर्क ले और bool, एक प्रतिदेय उद्देश्य यह है कि दो तर्क लेता है और रिटर्न & & bool की वापसी की तरह दो कार्यों से, प्राप्त करने में सक्षम होना चाहता हूँ: की तर्ज पर कुछ एस। तर्कों का प्रकार मनमाने ढंग से है।

पर वापस आने वाले कार्यों के लिए operator&& की तरह कुछ।

+0

क्या आप एक ऐसा फ़ंक्शन नहीं चाहते हैं जो एक तर्क लेता है और एक बूल देता है? मैं 'match1 (" एक परीक्षण ", एक्स) और match2 (42, एक्स)' के बराबर है? या आप वास्तव में 'match1 ("एक परीक्षण", एक्स) और& match2 (42, वाई) 'चाहते हैं? –

+0

मुझे वास्तव में एक ऐसा फ़ंक्शन चाहिए जो दो तर्क लेता है। –

उत्तर

9

रिटर्न प्रकार boost::bind ओवरलोड operator && (साथ ही साथ many others)। तो तुम

boost::bind(match1, "a test", _1) && boost::bind(match2, 42, _2); 

बारे में आप यह मान संग्रहीत करना चाहते हैं boost::function का उपयोग करते हैं कर सकते हैं। इस मामले में, प्रकार होगा

boost::function<bool(const char *, const char *)> 

ध्यान दें कि यह boost::bind की वापसी प्रकार (कि अनिर्दिष्ट है) नहीं है, लेकिन सही हस्ताक्षर के साथ किसी भी functor एक boost::function के लिए परिवर्तनीय है।

+0

@sth, संपादित, अच्छा सुझाव –

+0

क्या मेरे पास कोई ऐसा फ़ंक्शन है जो 'बूस्ट: बाइंड' के प्रकार का कुछ प्रकार देता है? –

+1

@ हेल्टन, अच्छा सवाल - मेरा संपादन देखें –