कोई std :: stou क्यों नहीं है?


96

C ++ 11 ने कुछ नए स्ट्रिंग रूपांतरण कार्य जोड़े:

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

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

संबंधित: C ++ 11 में कोई "sto {short, unsigned short}" फ़ंक्शन नहीं है?


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

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

4
@SethCarnegie ठीक है, आपके प्लेटफ़ॉर्म (और शायद अधिकांश प्लेटफ़ॉर्म) जो करता है वह सिर्फ अप्रासंगिक है, क्योंकि एक औचित्य unsigned longनहीं है unsigned int
क्रिश्चियन राऊ

4
@SethCarnegie: मेरे विशिष्ट कंप्यूटर पर, unsigned long64 बिट्स और unsigned int32 हैं। वे अलग-अलग प्रकार के हैं, और उन्हें एक-दूसरे के समान नहीं माना जा सकता है।
माइक सेमुर

2
@NicolBolas जैसा कहा गया है, ओपी (और मुझे) पता नहीं है कि यह सट्टा है, क्योंकि इसके लिए एक सही वैध कारण हो सकता है क्योंकि यह C ++ के भाषा इंटर्नल में गहरा था। लेकिन जब से आप कहते हैं कि यह सट्टा है मुझे लगता है कि ऐसा कोई कारण नहीं है। लेकिन फिर, शायद एक C ++ 11-जिम्मेदार व्यक्ति अभी भी इसका जवाब दे सकता है। यह कोई "वाह वाह, कहाँ है कि लानत है stou" -प्रश्न, लेकिन इस स्पष्ट असंगति के संभावित कारण के लिए एक सवाल पूछ रहा है। यदि आप जानते हैं कि ऐसा कोई कारण नहीं है, तो ठीक है, इसे उत्तर के रूप में पोस्ट करें।
क्रिश्चियन रौ

जवाबों:


29

सबसे पैट उत्तर यह होगा कि सी लाइब्रेरी की कोई संगत नहीं है ”strtou " नहीं है, और सी ++ 11 स्ट्रिंग फ़ंक्शन सी लाइब्रेरी फ़ंक्शंस के चारों ओर केवल पतले पर्दा वाले रैपर हैं: std::sto*फ़ंक्शंस मिरर strto*, और std::to_stringफ़ंक्शंस का उपयोग करते हैं sprintf


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


14
क्या आप जानते हैं कि C ++ कमेटी ने ऐसे C-ish दृष्टिकोण के लिए जाने का निर्णय क्यों लिया? ऐसा कुछ ऐसा boost::lexical_cast<>()लगता है जैसे चीजों को करने का अधिक सी ++ तरीका।
पॉल मंटा

2
क्या ये कार्यान्वयन विवरण वास्तव में मानक-परिभाषित हैं?
हल्बी की दौड़ ऑर्बिट

4
@LightnessRacesinOrbit: के लिए sto*, C ++ 11 21.5 / 1: प्रभाव: पहले दो फ़ंक्शन कॉल strtol (str.c_str (), ptr, base), और अंतिम तीन फ़ंक्शन strtoul (str__str) (ptr, base) कहते हैं ), strtoll (str.c_str (), ptr, base), और strtoull (str.c_str (), ptr, base) क्रमशः।
माइक सेमुर

12
इससे कोई फर्क नहीं पड़ता कि क्या C ++ मानक कहता है "कॉल करके लागू किया जाना चाहिए ...", क्योंकि C ++ मानक में अभी भी वैश्विक-जैसा नियम है: यदि मानक का कहना है std::sto*कि C लाइब्रेरी फ़ंक्शंस के लिए रैपर के रूप में लागू किया जाना चाहिए, और एक वैध कार्यक्रम यह नहीं बता सकता है कि वे गुप्त रूप से अलग तरीके से लागू नहीं हुए हैं, कार्यान्वयन वैध है।

2
पूरी तरह से ऑफ-टॉपिक, मुझे लगता है कि बूस्ट / लेक्सिकल_कास्ट जैसे आईस्ट्रीम का उपयोग नहीं करने का व्यावहारिक कारण सरासर प्रदर्शन है; मेरा मानना ​​है कि iostream स्ट्रैटोल आदि के खिलाफ काफी अंतर से हार जाता है।
१०:३१ पर केरेक एसबी

22

मुझे नहीं पता कि क्यों 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;
}

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


के बीच का अंतर stoiऔर stol, या stolऔर stollभी केवल एक सीमा की जांच है।
होसैन

1
@ होसेन: के बीच stoiऔर stol, हाँ। लेकिन stolऔर stollकेवल रेंज चेक में भिन्न नहीं होते हैं, वे विभिन्न पुस्तकालय कार्यों को कहते हैं।
बेन Voigt

0
unsigned long ulval = std::stoul(buf);
unsigned long mask = ~0xffffffffl;
unsigned int uival;
if( (ulval & mask) == 0 )
    uival = (unsigned int)ulval;
else {
    ...range error...
}

मास्क में व्यक्त बिट्स में अपेक्षित मूल्य आकार के साथ ऐसा करने के लिए मास्क का उपयोग करना, इस काम को 64-बिट लॉन्ग बनाम 32-बिट इनट्स के लिए करेगा, लेकिन 32-बिट लॉन्ग बनाम 32-बिट इनट्स के लिए भी।

64-बिट लंबे समय के मामले में, ~ 0xffffffffl 0xffffff000000000000 बन जाएगा और इस प्रकार देखेगा कि क्या शीर्ष 32 बिट्स में से कोई सेट किया गया है। 32-बिट लॉन्ग के साथ, यह ~ 0xffffffl 0x00000000 हो जाता है और मास्क चेक हमेशा शून्य रहेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.