2012-01-03 17 views
66

सी ++ 11 कुछ नए स्ट्रिंग रूपांतरण कार्यों कहा:कोई std :: stou क्यों नहीं है?

http://en.cppreference.com/w/cpp/string/basic_string/stoul

यह करने के लिए Stoi (स्ट्रिंग int करने के लिए), stol (लंबी स्ट्रिंग), स्टॉल (लंबे को स्ट्रिंग), stoul (स्ट्रिंग शामिल हस्ताक्षर किए गए लंबे), स्टॉल (लंबे समय तक हस्ताक्षर किए जाने के लिए स्ट्रिंग)। इसकी अनुपस्थिति में उल्लेखनीय एक स्टू (हस्ताक्षर करने के लिए स्ट्रिंग) फ़ंक्शन है। क्या कोई कारण है कि इसकी आवश्यकता नहीं है लेकिन बाकी सभी हैं?

संबंधित: No "sto{short, unsigned short}" functions in C++11?

+0

रचनात्मक नहीं, इसी कारण से अन्य प्रश्न रचनात्मक नहीं है। –

+5

मेरा प्रश्न "स्टॉल का उपयोग करने की कुछ गैर-स्पष्ट कमी है" के आधार पर और अधिक होने का इरादा था। जाहिर है कि टेम्पलेट तत्कालता के साथ गड़बड़ होगी, लेकिन क्या कोई और चीज है जिस पर मैं विचार नहीं कर रहा हूं? यह क्यों छोड़ा गया था पर टिप्पणियां अच्छा लेकिन माध्यमिक होगा। –

+9

@ निकोलबोलस मैं नहीं देख सकता कि यह रचनात्मक क्यों नहीं है। यह एक पूरी तरह से वैध सवाल है क्योंकि मुझे इस असंगतता के लिए कोई कारण नहीं दिख रहा है और एवर कुछ संभावित रूप से मौजूदा वैध में अंतर्दृष्टि दे सकते हैं लेकिन इसके लिए स्पष्ट कारण नहीं है। –

उत्तर

20

सबसे पैट जवाब होगा सी पुस्तकालय कोई इसी “ strtou ” है, और सी ++ 11 स्ट्रिंग कार्यों चारों ओर सी पुस्तकालय कार्यों सिर्फ बारीकी अप्रत्यक्ष रैपर हैं कि: std::sto* कार्यों strto* दर्पण, और std::to_string कार्य sprintf का उपयोग करें।


संपादित करें: KennyTM बताते हैं, अंतर्निहित रूपांतरण समारोह के रूप में दोनों stoi और stol उपयोग strtol, लेकिन यह अभी भी रहस्यमय है, जबकि वहां मौजूद stoulstrtoul का उपयोग करता है, वहाँ कारण है कि कोई इसी stou के रूप में।

+10

क्या आप जानते हैं कि सी ++ कमेटी ने ऐसे सी-ईश दृष्टिकोण के लिए क्यों जाने का फैसला किया? कुछ 'बूस्ट :: lexical_cast <>()' की तरह कुछ चीजों को करने का एक और सी ++ तरीका लगता है। –

+2

क्या ये कार्यान्वयन विवरण वास्तव में मानक परिभाषित हैं? –

+0

@ लाइटनेसरेसेसिन ऑर्बिट: हाँ, वे हैं। –

18

मुझे पता नहीं है क्यों stoi मौजूद है, लेकिन नहीं stou, लेकिन stoul और एक काल्पनिक stou के बीच फर्क सिर्फ इतना है एक चेक होगा कि परिणाम unsigned की सीमा में है:

unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) { 
    unsigned long result = std::stoul(str, idx, base); 
    if (result > std::numeric_limits<unsigned>::max()) { 
     throw std::out_of_range("stou"); 
    } 
    return result; 
} 

(इसी प्रकार, stoistol के समान है, बस एक अलग सीमा जांच के साथ; लेकिन चूंकि यह पहले से मौजूद है, इस बारे में चिंता करने की आवश्यकता नहीं है कि इसे कैसे कार्यान्वित किया जाए।)

+0

'stoi' और' stol', या 'stol' और' stoll' के बीच का अंतर भी एक सीमा जांच है। – Hossein

+1

@ होसेन: 'stoi' और 'stol' के बीच, हाँ। लेकिन 'stol' और' stoll' केवल रेंज चेक में भिन्न नहीं होते हैं, वे अलग-अलग लाइब्रेरी फ़ंक्शंस को कॉल करते हैं। –

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