| 39 | // Sadly GCC < 11 is missing the floating point versions. |
| 40 | template<typename T> |
| 41 | auto parse(std::string_view s, int base = 10) |
| 42 | -> std::enable_if_t<std::is_integral_v<T>, std::optional<T>> |
| 43 | { |
| 44 | T t; |
| 45 | auto r = std::from_chars(s.data(), s.data() + s.size(), t, base); |
| 46 | if ((r.ec != std::errc{}) || (r.ptr != s.data() + s.size())) { |
| 47 | return std::nullopt; |
| 48 | } |
| 49 | return t; |
| 50 | } |
| 51 | |
| 52 | // As above, but succeed on trailing characters and trim the supplied |
| 53 | // string_view to remove the parsed number. Set the supplied |