2008-10-11 13 views
17

हाल ही में मैं स्कॉट Meyers उत्तम Effective C++ पुस्तक के माध्यम से पढ़ रहा है। आखिरी युक्तियों में से एक में उन्होंने टीआर 1 की कुछ विशेषताओं को कवर किया - मैं बूस्ट के माध्यम से उनमें से कई को जानता था। tr1 :: reference_wrapper:tr1 :: context_wrapper कैसे उपयोगी है?

हालांकि, वहाँ एक है कि मैं निश्चित रूप से पहचाना नहीं था।

मैं tr1 :: context_wrapper का उपयोग कब और कब करूंगा?

उत्तर

16

यह बढ़ावा देने की तरह है :: रेफरी, जहां तक ​​मुझे पता है। असल में, एक संदर्भ जिसे कॉपी किया जा सकता है। बहुत उपयोगी जब कार्यों के लिए बाध्यकारी जहां आपको संदर्भ द्वारा पैरामीटर पारित करने की आवश्यकता है।

उदाहरण (बढ़ावा सिंटैक्स का उपयोग) के लिए:

void Increment(int& iValue) 
{ 
    iValue++; 
} 

int iVariable = 0; 
boost::function< void() > fIncrementMyVariable = boost::bind(&Increment, boost::ref(iVariable)); 

fIncrementMyVariable(); 

This Dr. Dobbs article कुछ जानकारी है।

आशा यह सही है, और उपयोगी है। :)

+0

, ठीक है शांत। मैं boost :: ref से परिचित हूं ... मुझे अभी यह पता नहीं चला कि TR1 इस कार्यक्षमता को कुछ अलग कहलाता है - यानी, tr1 :: ref। – paxos1977

+2

@ceretullis रेफरी एक reference_wrapper वस्तु है, जहां टी एक प्रकार है निर्माण करने के लिए निर्माता विधि है। –

+0

सी ++ 11 के साथ, मुझे लगता है कि मैं एक लैम्ब्डा उपयोग करने के लिए पसंद करते हैं: 'ऑटो fIncrement = [और iVariable] {वृद्धि (iVariable);};' –

11

reference_wrapper<T> एक बेहद उपयोगी और सरल पुस्तकालय है। आंतरिक रूप से reference_wrapper<T> टी के लिए एक सूचक को संग्रहीत करता है लेकिन इंटरफ़ेस में इसका खुलासा कोई सूचक संकेत नहीं होता है।

  • यह संदर्भ अन्य साधारण वस्तुओं की तरह व्यवहार करने के लिए अनुमति देता है - एक reference_wrapper<T> एक एसटीएल कंटेनर में संग्रहित किया जा सकता है। इतने सारे विभाजन दोष का कारण -
  • यह भयानक सूचक संकेतन से बचने में मदद करता है। जहां भी संभव (बिल्कुल संकेत दिए गए एक ढेर-आवंटित वस्तुओं को हटाने के लिए भंडारित किया जा करने की जरूरत है, लेकिन स्मृति प्रबंधन बूस्ट के लिए सूचक कंटेनर काफी उपयोगी होते हैं) टी करने के लिए एक सूचक एक reference_wrapper<T>, संदर्भ से संकेत दिए गए और T->f() साथ T.f() से बदलें।

उदाहरण:

class A 
{ 
    //... 
}; 

class B 
{ 
public: 
    void setA(A& a) 
    { 
    a_ = boost::ref(a); // use boost::cref if using/storing const A& 
    } 
    A& getA() 
    { 
     return a_; 
    } 
    B(A& a): a_(a) {} 
private: 
    boost::reference_wrapper<A> a_; 
}; 

int main() 
{ 
    A a1; 
    B b(a1); 
    A a2; 
    b.setA(a2); 
    return 0; 
} 

यहाँ मैं संदर्भ आवरण का बढ़ावा कार्यान्वयन का इस्तेमाल किया है, लेकिन C++ 0x मानक यह भी है जा रहा है। यह भी देखें http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

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