2010-03-10 15 views
9

मेरे पास पॉइंटर्स का वेक्टर है। मैं प्रत्येक तत्व के लिए एक फ़ंक्शन कॉल करना चाहता हूं, लेकिन वह फ़ंक्शन एक संदर्भ लेता है। तत्वों को कम करने का कोई आसान तरीका है?for_each और boost :: का उपयोग करना पॉइंटर्स के वेक्टर के साथ बाध्य

उदाहरण:

MyClass::ReferenceFn(Element & e) { ... } 

MyClass::PointerFn(Element * e) { ... } 

MyClass::Function() 
{ 
    std::vector< Element * > elements; 
    // add some elements... 

    // This works, as the argument is a pointer type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::PointerFn, boost::ref(*this), _1)); 

    // This fails (compiler error), as the argument is a reference type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 
} 

मैं एक गंदा थोड़ा आवरण है कि एक सूचक लेता है बना सकते हैं, लेकिन मैं वहाँ लगा एक बेहतर तरीका होना था?

+0

क्या कोई कारण है कि आप 'boost :: ref (* this) 'का उपयोग कर रहे हैं? मैं बस उपयोग करता हूं: boost :: bind (& MyClass :: ReferenceFn, this, _1) और यह ठीक काम करता है। –

उत्तर

15

आप boost::indirect_iterator इस्तेमाल कर सकते हैं:

std::for_each(boost::make_indirect_iterator(elements.begin()), 
       boost::make_indirect_iterator(elements.end()), 
       boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 

कि अनुकूलित इटरेटर अपने operator* में दो बार भिन्नता होगा।

+4

+1, हालांकि इस मामले के लिए मैं 'BOOST_FOREACH (एलिमेंट * ई, तत्व) को पसंद करता हूं-> संदर्भ एफएन (* ई);'। सी ++ एक कार्यात्मक भाषा के रूप में प्रयोग योग्य हो सकता है, लेकिन एक * संक्षिप्त * कार्यात्मक भाषा के रूप में नहीं ... –

+0

और पाइथन तत्वों में ई के लिए होगा: self.ReferenceFn (e) '। यह दिल टूट रहा है। –

+4

सी ++ 0x के लिए यह '(ऑटो * ई: तत्व) संदर्भ एफएन (* ई); 'के लिए होगा। मीठे :) –

3

ऐसा लगता है कि आप Boost.Lambda लाइब्रेरी का भी उपयोग कर सकते हैं।

// Appears to compile with boost::lambda::bind 
    using namespace boost::lambda; 
    std::for_each(elements.begin(), elements.end(), 
        bind(&MyClass::ReferenceFn, boost::ref(*this), *_1)); 

लेकिन मैं टिप्पणियों से BOOST_FOREACH पसंद करने के बारे में सहमत हूं। for_each "एल्गोरिदम" व्यावहारिक रूप से कुछ भी उपयोगी नहीं है, और यह क्या करता है, लूप के लिए श्रेणी-आधारित आपके लिए बहुत कम प्रयास कर सकता है।

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

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