boost::any
और boost::any_cast
void*
और dynamic_cast
का उपयोग करने से अधिक लाभ क्या हैं?`शून्य *` से `बूस्ट :: कोई भी बेहतर क्यों है?
उत्तर
लाभ यह है कि boost::any
void*
से अधिक प्रकार-सुरक्षित है।
उदा।
int i = 5;
void* p = &i;
static_cast<double*>(p); //Compiler doesn't complain. Undefined Behavior.
boost::any a;
a = i;
boost::any_cast<double>(a); //throws, which is good
अपनी टिप्पणी के रूप में, आप dynamic_cast
एक void*
से नहीं कर सकते। आप केवल संकेत और वर्ग प्रकार जो कम से कम एक आभासी समारोह (उर्फ बहुरूपी प्रकार)
हाँ, लेकिन यह एक स्थिर कलाकार है, गतिशील नहीं डाली।आपकी टिप्पणी कि आप 'void *' पर 'dynamic_cast' का उपयोग नहीं कर सकते, एक बेहतर उत्तर था। या आपका मुद्दा था कि आपको 'static_cast' का उपयोग करने से रोक नहीं रहा है, भले ही आपको नहीं करना चाहिए? :) –
@ पॉल: उस भाग को मेरे उत्तर में जोड़ा गया –
यह है के लिए संदर्भ से dynamic_cast
कर सकते हैं क्या बढ़ावा के संदर्भ का कहना है:
यह किसी भी मान प्रकार की नकल का समर्थन करता है और सुरक्षित जाँच का निष्कर्षण जो उसके प्रकार के खिलाफ सख्ती से मूल्यवान है।
इनमें से कोई भी void*
के साथ नहीं किया जा सकता है। आपके लिए कोई जांच नहीं है और आपको खुद को जानना है कि आप इसे किस पर डाल सकते हैं।
मुझे नहीं लगता कि dynamic_cast
तस्वीर में प्रवेश करता है, क्योंकि इसमें सीधे कुछ भी नहीं है।
boost::any
कॉल विनाशकर्ता:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
किसी भी तरह कोई भी नहीं है कि को बढ़ावा देने का उल्लेख किया :: किसी भी <> एक मान प्रकार है, जहां के रूप में शून्य * एक सूचक है के रूप में कार्य करता है। इसका मतलब है कि कोई भी <> किसी भी आकार के किसी भी वस्तु को स्टोर कर सकता है। एक बार संग्रहीत हो जाने पर, आप कहीं भी <> वैरिएबल को टाइप कर सकते हैं; यह अपने आप पर रहता है।
दूसरी तरफ शून्य * सूचक आकार का है, तो आपको या तो यह सुनिश्चित करना होगा कि आकार (आपका डेटा) < = sizeof (शून्य *) या आपका शून्य * संग्रहीत वास्तविक डेटा के लिए केवल एक सूचक है कहीं और। लेकिन उस स्थिति में, यह किसी भी < से पूरी तरह से अलग है> क्योंकि अब आपको उस "कहीं और" के बारे में चिंता करने की ज़रूरत है और सुनिश्चित करें कि जब तक शून्य * वैध है, तब तक यह वैध रहता है, जो कभी-कभी चुनौती बन सकता है, खासकर बहुप्रचारित अनुप्रयोगों में ।
प्लस जैसा कि किसी ने < का उल्लेख किया है, यह बहुत ही सुरक्षित है, यह आपके इच्छित कुछ भी स्टोर करेगा, लेकिन इसे वापस पाने का एकमात्र तरीका सटीक प्रकार जानना है या यह विफल रहता है (जो कि जब कोई परेशान हो सकता है एपीआई आपको हस्ताक्षरित int देता है और आपका कोड int को विभिन्न प्रकार के रूप में माना जाता है)। शून्य * आपको वह कुछ भी करने देगा जो आप चाहते हैं और यदि आप ढेर और/या अनियमित स्मृति पर पढ़ना या फ़र्श करना शुरू करते हैं, तो यह आपको रोक नहीं देगा या आपको यह भी बताएगा कि आप ऐसा कर रहे हैं।
- 1. कोई भी तारीख डेटा प्रकार से अधिक शून्य है?
- 2. कोई भी शून्य से कम बुराई नहीं है?
- 3. बूस्ट :: ptr_list अंतर्निहित शून्य * का उपयोग क्यों करता है?
- 4. P6Spy से बेहतर कुछ भी?
- 5. बूस्ट भावना भी लालची है
- 6. siftDown siftUp से बेहतर क्यों है?
- 7. क्या ट्विस्ट का कोई भी व्यापक, व्यापक दस्तावेज है जो आधिकारिक साइट से बेहतर है?
- 8. शून्य संरचना क्यों है?
- 9. क्यों HttpContext.Current.Handler शून्य है?
- 10. बूस्ट। किसी भी मूल प्रकार
- 11. getClass()। GetClassLoader() शून्य है, क्यों?
- 12. जावा ArrayIndexOutOfBoundsException: शून्य लेकिन कोई स्टैक ट्रेस क्यों नहीं है?
- 13. क्या कोई बूस्ट iostreams
- 14. पाइथन में "अगर कुछ नहीं है": "अगर कुछब == कोई नहीं:" से बेहतर क्यों है?
- 15. मेरा user_id शून्य क्यों है?
- 16. यदि कोई कॉलम शून्य है
- 17. बूस्ट scoped_lock क्यों mutex अनलॉक नहीं है?
- 18. यूलेर एकीकरण से वेरलेट एकीकरण बेहतर क्यों है?
- 19. SelectSingleNode वापस शून्य क्यों है?
- 20. जांचें कि कोई कॉलम शून्य नहीं है
- 21. सिंक्रनाइज़ेशन Context.Current शून्य क्यों है?
- 22. आकार (शून्य) == 1 क्यों है?
- 23. self.navigationItem.backBarButtonItem हमेशा शून्य क्यों है?
- 24. बूस्ट में गायब/गलत कुंजी का बेहतर प्रबंधन :: program_options
- 25. बूस्ट - unordered_set ट्यूटोरियल/उदाहरण/कुछ भी?
- 26. उपयोग करने से बेहतर क्यों उपयोग किया जाता है?
- 27. क्या कोई बेहतर डिज़ाइन विकल्प है?
- 28. कास्टिंग (int?) शून्य बनाम नया int?() - कौन सा बेहतर है?
- 29. डब्ल्यूपीएफ डेटा सत्यापन? IDataErrorInfo से बेहतर कुछ भी?
- 30. कुछ भी नहीं! = शून्य - या यह करता है?
आप 'void *' –
@ArmenTsirunyan से 'dynamic_cast' नहीं कर सकते हैं, मैं हमेशा मानता हूं कि ऐसा करना संभव था, हालांकि मैंने कभी कोशिश नहीं की ...: | –
@ पॉलमंता आर्मेन की टिप्पणी के बारे में, आप इस सवाल पर एक नजर डाल सकते हैं http://stackoverflow.com/questions/6771998/dynamic-cast-of-void –