2009-08-28 17 views
9

मेरे पास एक std :: वेक्टर है और मैं प्रत्येक तत्व के विशिष्ट गुण को देखना चाहता हूं। कुछ संरचना में एक विशेषता 'प्रकार' है। मैं टाइप 1 या टाइप 2 होने के लिए इस विशेषता को देखना चाहता हूं।std :: find_if के साथ boost :: lambda के साथ कैसे उपयोग करें?

मेरी योजना boost :: lambda का उपयोग करना है।

std::vector<SomeStruct>::const_iterator it = 
    std::find_if(
     vec.begin(), vec.end(), 
     _1.type == SomeStruct::Type1 || _1.type == SomeStruct::Type2); 

क्योंकि मैं प्रत्येक तत्व का एक विशिष्ट विशेषता का उपयोग करने की जरूरत है, मैं अगर मैं कर सकते हैं उपयोग को बढ़ावा देने :: बिल्कुल लैम्ब्डा यकीन नहीं है।

कोई संकेत?

उत्तर

10
std::find_if(
    vec.begin(), vec.end(), 
    bind(&SomeStruct::type, _1) == SomeStruct::Type1 || 
    bind(&SomeStruct::type, _1) == SomeStruct::Type2); 
+0

यह सही है, लेकिन मैं यह नहीं समझ सकता कि यह क्यों काम करता है। यह भी वैसे ही काम करता है यदि आप बाध्य करते हैं (& SomeStruct :: func, _1) (जहां func एक फ़ंक्शन है) जो मुझे और भी भ्रमित करता है। – yhager

+0

@yhager 'bind (& someStruct :: type, _1) 'आपको एक बढ़ावा लैम्ब्डा देता है जो ऑब्जेक्ट पर' .type' करने के परिणाम के लिए खड़ा होता है जो '_1' प्लेसहोल्डर है। अधिक जानकारी के लिए [बाइंड के लिए प्रलेखन देखें] (http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions)। – sepp2k

1

आपका अभिव्यक्ति संकलन नहीं है क्योंकि की

_1.type 

डॉट ऑपरेटर यह बस वस्तु _1 के सदस्य type की चर्चा करते हुए है, अतिभारित नहीं किया जा सकता तो अपने अभिव्यक्ति एक लैम्ब्डा अभिव्यक्ति के रूप में काम नहीं कर सकता को बढ़ावा देने में परिभाषित किया गया :: lambda.hpp। खैर, मुझे नहीं पता कि _1 प्रकार क्या है और इस प्रकार के बारे में सोचने से मुझे कड़वाहट मिलती है - यह हमारे लिए नहीं है, इसे जानने के लिए प्राणियों :-)।
उचित अभिव्यक्ति sepp2k द्वारा दी गई है।

+0

'_1' का प्रकार' boost :: lambda :: placeholder1_type' है। – sepp2k

संबंधित मुद्दे