मुझे अपने सी ++ कोड में std :: experimental :: वैकल्पिक का उपयोग करना पसंद है, लेकिन समस्या यह है कि value_or को डिफ़ॉल्ट मान के समान प्रकार के डिफ़ॉल्ट मान की आवश्यकता होती है।सी ++ जंग के परिणाम <T, E> प्रकार के बराबर?
यह बहुत अच्छी तरह से काम नहीं करता है जब मैं एक वैकल्पिक चाहते है कि या तो एक पूर्णांक है या वह किसी त्रुटि संदेश में शामिल है।
मुझे लगता है कि मैं एक यूनियन स्ट्रक्चर का उपयोग कर सकता हूं जिसमें यह इंगित करने के लिए एक बूलियन है कि क्या मूल्य है या यह एक त्रुटि है, लेकिन यह सुनिश्चित होगा कि सी ++ में सिर्फ Result<T, E>
रस्ट की तरह टाइप किया गया हो।
क्या ऐसा कोई प्रकार है? बूस्ट ने इसे लागू क्यों नहीं किया है?
परिणाम वास्तव में विकल्प से अधिक उपयोगी है, और निश्चित रूप से बूस्ट के लोग इसके अस्तित्व से अवगत हैं। शायद मैं जंग के कार्यान्वयन को पढ़ूंगा और फिर इसे सी ++ में कॉपी करूंगा?
पूर्व:
// Function either returns a file descriptor for a listening socket or fails
// and returns a nullopt value.
// My issue: error messages are distributed via perror.
std::experimental::optional<int> get_tcp_listener(const char *ip_and_port);
// You can use value_or to handle error, but the error message isn't included!
// I have to write my own error logger that is contained within
// get_tcp_listener. I would really appreciate if it returned the error
// message on failure, rather than an error value.
int fd = get_tcp_listener("127.0.0.1:9123").value_or(-1);
// Rust has a type which does what I'm talking about:
let fd = match get_tcp_listener("127.0.0.1:9123") {
Ok(fd) => fd,
Err(msg) => { log_error(msg); return; },
}
संभावित रूप से प्रस्तावित 'std :: अपेक्षित', या किसी अन्य 'अपेक्षित' किसी के लागू किए गए प्रकार। – chris
सी ++ में एक अभिव्यक्ति का संकलन समय पर ज्ञात एक प्रकार होना चाहिए; यह या तो 'int' या स्ट्रिंग नहीं हो सकता है। –
एक चीज की तुलना में एक चीज अधिक उपयोगी कैसे होती है जब वे पूरी तरह से असंबंधित, ऑर्थोगोनल समस्याओं का समाधान करते हैं? 'वेक्टर' 'cout' से अधिक उपयोगी है? – Barry