2012-06-28 7 views
7

सामग्री के लिए सूचक * एक वस्तु को बढ़ावा के भीतर समाहित करने के लिए बात करने के लिए :: किसी भी वस्तु।प्राप्त शून्य * मैं एक तरीका है जिसके एक शून्य *</p> <p>मैं इस शून्य चाहते स्वीकार करता है कि एक बाहरी पुस्तकालय का उपयोग कर रहा बढ़ावा की :: किसी भी

क्या किसी भी वस्तु :: किसी ऑब्जेक्ट की सामग्री के पते पर जाना संभव है?

मैं myAny.content के साथ खेलने की कोशिश कर रहा हूं लेकिन अब तक कोई भाग्य नहीं है! मुझे आशा है कि गतिशील_कास्ट या unsafe_any_cast के कुछ संयोजन मुझे जो चाहिए उसे दे देंगे।

धन्यवाद!

उत्तर

3

दुर्भाग्य से यह संभव नहीं है; boost::any_cast उस प्रकार कास्ट अस्वीकार कर देगा यदि प्रकार निहित प्रकार से अलग है।

boost::any any_value(value); 
void *content = boost::unsafe_any_cast<void *>(&any_value); 

हैडर है:

आप एक असमर्थित आंतरिक हैक उपयोग करने के लिए तैयार हैं, तो current version of the header एक गैर-दस्तावेजी और असमर्थित समारोह boost::unsafe_any_cast (जैसा कि इसके नाम से पता चलता है) प्रकार की जांच boost::any_cast द्वारा किया नजरअंदाज जो है यह unsafe_any_cast के बारे में कहने के लिए:

// Note: The "unsafe" versions of any_cast are not part of the 
// public interface and may be removed at any time. They are 
// required where we know what type is stored in the any and can't 
// use typeid() comparison, e.g., when our types may travel across 
// different shared libraries. 
+0

यह प्रलेखित इंटरफ़ेस का हिस्सा होना चाहिए, इसलिए 'boost :: any' का उपयोग विरासत कोड के साथ किया जा सकता है जो 'शून्य *' का उपयोग करता है। सभी का सबसे दुखद, 'std :: प्रयोगात्मक :: किसी भी' में 'unsafe_any_cast' भी प्रतीत नहीं होता है। – alfC

5

आप अंतर्निहित प्रकार के सूचक को प्राप्त करने के लिए boost::any_cast का उपयोग कर सकते हैं (बशर्ते आप इसे संकलित समय पर जानते हों)।

boost::any any_i(5); 

int* pi = boost::any_cast<int>(&any_i); 
*pi = 6; 

void* vpi = pi; 
+0

यह कोड वास्तव में क्या कर रहा है? ऐसा लगता है कि यह स्वयं को एक int में संबोधित कर रहा है। यह कैसे काम करता है? – ftvs

+1

यही है 'boost :: any_cast' करता है। इसमें 'गतिशील_कास्ट' के समान समान अर्थशास्त्र हैं। इस मामले में, 'int *' को कास्टिंग सफल हो जाएगा, क्योंकि अंतर्निहित प्रकार एक int है। किसी अन्य सूचक प्रकार के लिए आवरण ('फ्लोट *' कहें), जिसके परिणामस्वरूप 'नलप्टर' वापस आ जाएगा। किसी संदर्भ प्रकार को कास्ट करना या तो सफल होगा, या 'boost :: bad_any_cast' अपवाद फेंक देगा। 'boost :: any' केवल सटीक प्रकार के मैचों पर काम करता है, अगर मैं सही ढंग से याद करता हूं तो यह मिलान के लिए' टाइपिड' का उपयोग करता है। – Chad

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