क्या कोई std::stoull है जो basic_string_view लेता है? मैं केवल std::stoull को कॉल करने के लिए एक स्ट्रिंग का निर्माण नहीं करना चाहता, खासकर जब से इसे const & द्वारा लिया जाता है।

यदि कोई मौजूद नहीं है, तो std::basic_string_view को unsigned long long में बदलने का प्रभावी तरीका क्या है?

0
j5w 28 जुलाई 2020, 03:44

2 जवाब

सबसे बढ़िया उत्तर

यदि आप अधिक दक्षता की तलाश में हैं, तो C++17 ने निचले-स्तर के रूपांतरणों को प्रस्तुत किया है। a> <charconv> में (लाइव उदाहरण):

#include <charconv>
#include <iostream>
#include <string_view>

using namespace std::literals;

int main() {
    const auto str = "2048"sv;

    unsigned long long result;
    auto [ptr, err] = std::from_chars(str.data(), str.data() + str.size(), result);

    if (err == std::errc{} && ptr == str.data() + str.size()) {
        std::cout << "Entire conversion successful: " << result;
    }
}

मेरे द्वारा str.begin() और str.end() का उपयोग न करने का कारण यह है कि API सीधे const char* पर काम करता है, पुनरावृत्त नहीं।

3
chris 28 जुलाई 2020, 04:10

नहीं, ऐसा नहीं है, और cppreference बताते हैं कि क्यों:

stoull ... कॉल std::strtoull(str.c_str(), &ptr, base)

जिसके लिए एक नल-टर्मिनेटेड स्ट्रिंग की आवश्यकता होती है (जो std::string_view प्रदान करने का वादा नहीं करता है)।

हालाँकि, ध्यान दें कि std::string में एक कनवर्टिंग कंस्ट्रक्टर है जो string_view लेता है ताकि आप लिख सकें:

auto ull = std::stoull (std::string (my_string_view));

जो शायद उतना ही अच्छा समाधान है जितना कोई।

1
Paul Sanders 28 जुलाई 2020, 04:00