2013-06-29 5 views
5

के लिए मैं कैसे boost::optional काम करता है के बारे में कुछ प्रश्न हैं। का पहला ऐसा करने दो:तुलना (<), निर्गम (<<) और असाइनमेंट (=) को बढ़ावा देने :: वैकल्पिक

boost::optional<int> i; 
  1. i < 3 हमेशा *i < 3 के बराबर (और अन्य संबंधपरक ऑपरेटर के लिए समान) है?
  2. क्या यह सही है कि i < 3 और *i < 3 शर्तों को परिभाषित नहीं किया गया है? (i अभी भी कुछ भी करने के लिए सेट नहीं किया गया है)
  3. क्या std::cout << i मुद्रित करने के लिए माना जाता है?
  4. मैं बहुत यकीन है कि i = 3 हमेशा *i = 3 रूप में ही है हूँ। यदि हां, तो मुझे कौन सा पसंद करना चाहिए?
+1

'i.get()' आपका ब्रो है। –

+1

ने अपने दस्तावेज़ों को देर से संस्करणों में गिरा दिया? –

उत्तर

9
  1. नहीं। अगर i अप्रारंभीकृत है, पहली सच लौटने जबकि दूसरा जोर होगा।
  2. नहीं। operator< के लिए प्रलेखन स्पष्ट रूप से इंगित करता है कि अगर लेफथैंड तर्क अनियंत्रित है तो यह true लौटाएगा जब राइथेंड ऑपरेंड सेट हो जाएगा।
  3. optional के लिए कोई है, इसलिए मुझे लगता है कि यह unspecified-bool-type रूपांतरण और 1 या 0 (सत्य/गलत) प्रिंट करेगा।
  4. वे समान नहीं हैं। यदि i प्रारंभ नहीं किया गया है तो उत्तरार्द्ध जोर देगा जबकि पूर्व प्रारंभिक और असाइन करेगा। आपको उस व्यक्ति का उपयोग करना चाहिए जो आपके इच्छित अर्थशास्त्र को इंगित करता है।
4

बिंदु 3 के बारे में, वहाँ है एक ऑपरेटर < < बढ़ावा :: वैकल्पिक बढ़ावा/वैकल्पिक/optional_io.hpp में घोषित करने के लिए है, लेकिन आप शायद उस शामिल नहीं कर रहे। (यदि आप बूस्ट property_tree का उपयोग करना चाहते हैं, तो यह आपके लिए शामिल हो जाता है।) यदि यह शामिल है, तो एक खाली वैकल्पिक "-" के रूप में स्ट्रीम होगा और एक पॉप्युलेट वैकल्पिक अतिरिक्त स्पेस कैरेक्टर को स्ट्रीम करेगा और फिर मान को स्ट्रीम करेगा।

तो यह कोड:

#include <boost/optional/optional_io.hpp> 
boost::optional<string> var1 = "value"; 
boost::optional<string> var2; 
cout << " var1 = '" << var1 << "'\n"; 
cout << "*var1 = '" << *var1 << "'\n"; 
cout << " var2 = '" << var2 << "'\n"; 

इस पैदावार:

var1 = ' value' 
*var1 = 'value' 
var2 = '--' 

लेकिन बिना शामिल पैदावार एक ही कोड इस, के रूप में मार्क बी के जवाब ने सुझाव दिया:

var1 = '1' 
*var1 = 'value' 
var2 = '0' 

कि पहले मामले में अतिरिक्त जगह ने मुझे कुछ भ्रम पैदा कर दिया है।

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