c++ कैसे बढ़ावा:: संस्करण और बढ़ावा:: किसी भी काम?




unions boost-variant (3)

यदि आप बढ़ावा देते हैं: कोई भी दस्तावेज़ वे विचार के लिए स्रोत प्रदान करते हैं: http://www.two-sdg.demon.co.uk/curbralan/papers/ValuedConversions.pdf

यह बुनियादी जानकारी छुपा रहा है, एक आवश्यक C ++ कौशल है यह जानें!

चूंकि उच्चतम मतदान का जवाब पूरी तरह से गलत है, और मुझे संदेह है कि लोग वास्तव में इस तथ्य को सत्यापित करने के लिए स्रोत को देखेंगे, यहां किसी भी तरह की इंटरफ़ेस का एक बुनियादी कार्यान्वयन है जो कि किसी भी प्रकार को एफ () फ़ंक्शन के साथ लपेटेगा और इसे कॉल करने की अनुमति दें:

struct f_any
{
   f_any() : ptr() {}
   ~f_any() { delete ptr; }
   bool valid() const { return ptr != 0; }
   void f() { assert(ptr); ptr->f(); }

   struct placeholder
   {
     virtual ~placeholder() {}
     virtual void f() const = 0;
   };

   template < typename T >
   struct impl : placeholder
   {
     impl(T const& t) : val(t) {}
     void f() const { val.f(); }
     T val;
    };
   // ptr can now point to the entire family of 
   // struct types generated from impl<T>
   placeholder * ptr;

   template < typename T >
   f_any(T const& t) : ptr(new impl<T>(t)) {}

  // assignment, etc...
};

बढ़ावा :: कोई भी एक ही मूल बात नहीं करता है, इसके अलावा कि एफ () वास्तव में typeinfo const& देता है और काम करने के लिए any_cast फ़ंक्शन को अन्य जानकारी प्रदान करता है।

संस्करण और बढ़ावा पुस्तकालय से कोई भी आंतरिक रूप से कैसे काम करता है? एक परियोजना में मैं काम कर रहा हूं, मैं वर्तमान में टैग किए गए संघ का उपयोग कर रहा हूं। मैं कुछ और का उपयोग करना चाहता हूं, क्योंकि सी ++ में यूनियनों ने आपको कंस्ट्रक्टर, डिस्ट्रक्टर्स या अतिभारित असाइनमेंट ऑपरेटर के साथ ऑब्जेक्ट का उपयोग नहीं करने दिया।

मैंने किसी भी और प्रकार के आकार की पूछताछ की, और उनके साथ कुछ प्रयोग किए। मेरे मंच में, संस्करण अपने सबसे लंबे समय तक संभव प्रकार के प्लस 8 बाइट्स का आकार लेता है: मुझे लगता है कि यह सिर्फ 8 बाइट्स ओ टाइप की जानकारी है और शेष को संचयित मान होने के कारण दूसरी ओर, किसी भी बस 8 बाइट्स लेता है। चूंकि मैं 64-बिट प्लेटफॉर्म पर हूं, मुझे लगता है कि कोई भी एक सूचक रखता है।

कोई कैसे जानता है कि यह किस प्रकार रखता है? टेम्पलेट्स के माध्यम से यह क्या करता है? मैं इन वर्गों के बारे में उन्हें इस्तेमाल करने से पहले जानना चाहता हूं।


boost::any और boost::variant बीच मुख्य अंतर यह है कि any भी किसी भी प्रकार को स्टोर कर सकता है, जबकि वे variant केवल एन्यूमरेटेड प्रकारों में से एक सेट कर सकते हैं। any प्रकार के ऑब्जेक्ट में एक void* पॉइंटर, साथ ही एक typeinfo ऑब्जेक्ट को अंतर्निहित प्रकार को याद करने के लिए और कुछ प्रकार की सुरक्षा प्रकार को सुरक्षित रखता है। boost::variant , यह अधिकतम आकार की ऑब्जेक्ट की गणना करता है, और इस बफर के भीतर ऑब्जेक्ट को आवंटित करने के लिए "प्लेसमेंट न्यू" का उपयोग करता है। यह प्रकार या प्रकार सूचकांक भी संग्रहीत करता है

ध्यान दें कि यदि आपने बूस्ट इंस्टॉल किया है, तो आपको "any.hpp" और "variant.hpp" में स्रोत फ़ाइलों को देखने में सक्षम होना चाहिए। बस "/ usr / local" में "include / boost / variant.hpp" और "include / boost / any.hpp" की खोज करें, और "/ opt / local" जब तक आप स्थापित हेडर नहीं पाते हैं, और आप देख सकते हैं

संपादित करें
जैसा कि नीचे दिए गए टिप्पणियों में बताया गया है, मुझे बढ़ावा देने के विवरण में कोई मामूली अयोग्यता थी: किसी भी हालांकि इसे void* (और सूचक को व्यवस्थित रूप से हटाए जाने के लिए एक टेम्पलेट में नष्ट कॉलबैक) का उपयोग करके कार्यान्वित किया जा सकता है, वास्तविक क्रियान्वयन any<T>::placeholder* का उपयोग any<T>::placeholder* any<T>::holder<T> के any<T>::placeholder उप-वर्गों के रूप में करता है any<T>::placeholder प्रकार को एकीकृत करने के लिए any<T>::placeholder


boost::any के स्नैपशॉट्स, जबकि typeinfo कन्स्ट्रक्टर चलाता है: इसमें एक गैर-टेम्पलेट बेस क्लास के लिए एक सूचक होता है जो टाइपइन्फो तक पहुंच प्रदान करता है, और कन्स्ट्रक्टर ने इंटरफ़ेस संतोषजनक एक प्रकार-विशिष्ट वर्ग प्राप्त किया है। उसी तकनीक का उपयोग वास्तव में एक प्रकार के अन्य सामान्य क्षमताओं (जैसे कि स्ट्रीमिंग, सामान्य ऑपरेटरों, विशिष्ट फ़ंक्शंस) को कैप्चर करने के लिए किया जा सकता है, हालांकि बढ़ावा देने से इस पर नियंत्रण नहीं मिलता है।

boost :: variant conceptually जैसा कि आप पहले किया है, लेकिन सचमुच एक union का उपयोग नहीं करने के बजाय, बल्कि इसके बफर में ऑब्जेक्ट्स के निर्माण / विनाश के लिए एक मैनुअल दृष्टिकोण (बजाय संरेखण मुद्दों को स्पष्ट रूप से संभालने के लिए) के बजाय मैन्युअल तरीके से ले जाने के समान है। कि सी ++ में वास्तविक union में जटिल प्रकार हैं





boost-any