Safely convert std::string_view to int (like stoi or atoi)

后端 未结 2 695
粉色の甜心
粉色の甜心 2020-12-19 01:17

Is there a safe standard way to convert std::string_view to int?


Since C++11 std::string lets us use stoi

相关标签:
2条回答
  • 2020-12-19 01:36

    Unfortunately, there is no standard way that would throw an exception for you but std::from_chars has a return value code that you may use:

    #include <charconv>
    #include <stdexcept>
    
    template <class T, class... Args>
    void from_chars_throws(const char* first, const char* last, T &t, Args... args) {
        std::from_chars_result res = std::from_chars(first, last, t, args... );
    
        // These two exceptions reflect the behavior of std::stoi.
        if (res.ec == std::errc::invalid_argument) {
            throw std::invalid_argument{"invalid_argument"};
        }
        else if (res.ec == std::errc::result_out_of_range) {
            throw std::out_of_range{"out_of_range"};
        }
    }
    
    

    Obviously you can create svtoi, svtol from this, but the advantage of "extending" from_chars is that you only need a single templated function.

    0 讨论(0)
  • 2020-12-19 01:41

    The std::from_chars function does not throw, it only returns a value of type from_chars_result which is basically a struct with two fields:

    struct from_chars_result {
        const char* ptr;
        std::errc ec;
    };
    

    You should inspect the values of ptr and ec when the function returns:

    #include <iostream>
    #include <string>
    #include <charconv>
    
    int main()
    {
        int i3;
        std::string_view sv = "abc";
        auto result = std::from_chars(sv.data(), sv.data() + sv.size(), i3);
        if (result.ec == std::errc::invalid_argument) {
            std::cout << "Could not convert.";
        }
    }
    
    0 讨论(0)
提交回复
热议问题