2012-01-06 11 views
13

boost::any और boost::any_castvoid* और dynamic_cast का उपयोग करने से अधिक लाभ क्या हैं?`शून्य *` से `बूस्ट :: कोई भी बेहतर क्यों है?

+9

आप 'void *' –

+0

@ArmenTsirunyan से 'dynamic_cast' नहीं कर सकते हैं, मैं हमेशा मानता हूं कि ऐसा करना संभव था, हालांकि मैंने कभी कोशिश नहीं की ...: | –

+1

@ पॉलमंता आर्मेन की टिप्पणी के बारे में, आप इस सवाल पर एक नजर डाल सकते हैं http://stackoverflow.com/questions/6771998/dynamic-cast-of-void –

उत्तर

21

लाभ यह है कि boost::anyvoid* से अधिक प्रकार-सुरक्षित है।

उदा।

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* से नहीं कर सकते। आप केवल संकेत और वर्ग प्रकार जो कम से कम एक आभासी समारोह (उर्फ बहुरूपी प्रकार)

+0

हाँ, लेकिन यह एक स्थिर कलाकार है, गतिशील नहीं डाली।आपकी टिप्पणी कि आप 'void *' पर 'dynamic_cast' का उपयोग नहीं कर सकते, एक बेहतर उत्तर था। या आपका मुद्दा था कि आपको 'static_cast' का उपयोग करने से रोक नहीं रहा है, भले ही आपको नहीं करना चाहिए? :) –

+0

@ पॉल: उस भाग को मेरे उत्तर में जोड़ा गया –

5

यह है के लिए संदर्भ से dynamic_cast कर सकते हैं क्या बढ़ावा के संदर्भ का कहना है:

यह किसी भी मान प्रकार की नकल का समर्थन करता है और सुरक्षित जाँच का निष्कर्षण जो उसके प्रकार के खिलाफ सख्ती से मूल्यवान है।

इनमें से कोई भी void* के साथ नहीं किया जा सकता है। आपके लिए कोई जांच नहीं है और आपको खुद को जानना है कि आप इसे किस पर डाल सकते हैं।

मुझे नहीं लगता कि dynamic_cast तस्वीर में प्रवेश करता है, क्योंकि इसमें सीधे कुछ भी नहीं है।

13

boost::any कॉल विनाशकर्ता:

{ 
    boost::any x = std::string("Hello, world"); 
    x = std::wstring(L"Goodbye"); // string::~string called here 
} // wstring::~wstring called here 
6

किसी भी तरह कोई भी नहीं है कि को बढ़ावा देने का उल्लेख किया :: किसी भी <> एक मान प्रकार है, जहां के रूप में शून्य * एक सूचक है के रूप में कार्य करता है। इसका मतलब है कि कोई भी <> किसी भी आकार के किसी भी वस्तु को स्टोर कर सकता है। एक बार संग्रहीत हो जाने पर, आप कहीं भी <> वैरिएबल को टाइप कर सकते हैं; यह अपने आप पर रहता है।

दूसरी तरफ शून्य * सूचक आकार का है, तो आपको या तो यह सुनिश्चित करना होगा कि आकार (आपका डेटा) < = sizeof (शून्य *) या आपका शून्य * संग्रहीत वास्तविक डेटा के लिए केवल एक सूचक है कहीं और। लेकिन उस स्थिति में, यह किसी भी < से पूरी तरह से अलग है> क्योंकि अब आपको उस "कहीं और" के बारे में चिंता करने की ज़रूरत है और सुनिश्चित करें कि जब तक शून्य * वैध है, तब तक यह वैध रहता है, जो कभी-कभी चुनौती बन सकता है, खासकर बहुप्रचारित अनुप्रयोगों में ।

प्लस जैसा कि किसी ने < का उल्लेख किया है, यह बहुत ही सुरक्षित है, यह आपके इच्छित कुछ भी स्टोर करेगा, लेकिन इसे वापस पाने का एकमात्र तरीका सटीक प्रकार जानना है या यह विफल रहता है (जो कि जब कोई परेशान हो सकता है एपीआई आपको हस्ताक्षरित int देता है और आपका कोड int को विभिन्न प्रकार के रूप में माना जाता है)। शून्य * आपको वह कुछ भी करने देगा जो आप चाहते हैं और यदि आप ढेर और/या अनियमित स्मृति पर पढ़ना या फ़र्श करना शुरू करते हैं, तो यह आपको रोक नहीं देगा या आपको यह भी बताएगा कि आप ऐसा कर रहे हैं।

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