2012-02-16 17 views
12

निम्न कोड को संकलित करता है और "सही काम" करता है:बूस्ट :: संस्करण स्टोर संदर्भ कैसे करता है?

#include <boost/variant.hpp> 
#include <iostream> 

int main() 
{ 
    int a = 10; 
    boost::variant<int&, float&> x = a; 
    a = 20; 
    std::cout << boost::get<int&>(x) << "\n"; 
    return 0; 
} 

कैसे को बढ़ावा देने करता :: संस्करण की दुकान के लिए एक संदर्भ? सी ++ मानक के अनुसार, संदर्भ कैसे संग्रहीत किए जाते हैं पूरी तरह से कंपाइलर तक है। असल में, boost::variant कैसे पता चलता है कि संदर्भ द्वारा कितने बाइट उठाए जाते हैं? sizeof(T&) == sizeof(T), इसलिए यह sizeof() ऑपरेटर का उपयोग नहीं कर सकता है। अब, मुझे पता है कि संदर्भ शायद पॉइंटर्स के रूप में लागू किए जाते हैं, लेकिन भाषा में कोई गारंटी नहीं है। get<> का एक अच्छा स्पष्टीकरण और जब विज़िटर संदर्भ संग्रहीत कर रहा है तो विज़िटेशन कार्य करता है :)

+10

किसी ऑब्जेक्ट में उन्हें लपेटकर। '<< आकार (std :: वेक्टर और), आकार (std :: वेक्टर ), आकार (टी); संरचना टी {std :: वेक्टर & r;}; '56, 56, 8 –

उत्तर

6

आप संरचना फ़ील्ड को संदर्भ के रूप में घोषित कर सकते हैं।

struct ref_to_int { 
    ref_to_int(int& init) 
     : _storage(init) {} // _storage stores the reference. 
private: 
    int& _storage; 
}; 

आप sizeof(ref_to_int), जो 8 जीसीसी के साथ अपने 64 पर है ले जा सकते हैं। क्षेत्र संदर्भ स्टोर करता है।

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