Как написать функцию, которая возвращает результат преобразования строки в число как constexpr?

Как можно добавить синтаксис написания чисел в указанной системе счисления ("123"_4) в свою шаблонную библиотеку для работы с цифрами в разных представлениях и системах счисления, сохраняя при этом поддержку C++17? Какие библиотечные реализации могут помочь при этом, учитывая сложности работы с функциями вроде strtol из Си и std::from_chars из C++17?
  • 17 декабря 2023 г. 10:07
Ответы на вопрос 2
В C++17 нельзя написать constexpr-функцию для преобразования строки в число, так как constexpr функции имеют ограничения на использование операций и функций. Однако, в C++20 появилось расширение, позволяющее использовать более широкий набор операций и функций в constexpr функциях, включая преобразование строк в числа.

Вот пример, как можно реализовать constexpr-функцию для преобразования строки в число в C++20:

```cpp
constexpr int to_int(const char* str)
{
    int result = 0;

    for (int i = 0; str[i] != '\0'; i++)
    {
        // Checking if the character is a valid digit
        if (str[i] >= '0' && str[i] <= '9')
        {
            result = result * 10 + (str[i] - '0');
        }
    }

    return result;
}
```

Чтобы добавить синтаксис написания чисел в указанной системе счисления ("123"_4) в свою шаблонную библиотеку, можно воспользоваться user-defined literals в C++11. Вот пример:

```cpp
constexpr int operator"" _to_int(const char* str, std::size_t size)
{
    int result = 0;

    for (std::size_t i = 0; i < size; i++)
    {
        // Checking if the character is a valid digit
        if (str[i] >= '0' && str[i] <= '9')
        {
            result = result * 10 + (str[i] - '0');
        }
    }

    return result;
}
```

Теперь вы можете использовать данный литерал в своей шаблонной библиотеке:

```cpp
template<int N>
struct Number
{
    static constexpr int value = N;
};

// Пример использования
Number<"123"_to_int> number;
int result = number.value;  // 123
```

Что касается библиотечных реализаций для работы с функциями преобразования строк в числа, то в стандартной библиотеке C++ есть несколько полезных функций. Например:

- std::stoi - преобразует строку в целое число типа int
- std::stol - преобразует строку в целое число типа long
- std::stoll - преобразует строку в целое число типа long long
- std::stof - преобразует строку в число типа float
- std::stod - преобразует строку в число типа double
- std::stold - преобразует строку в число типа long double

Однако, данные функции не являются constexpr, поэтому их нельзя использовать в constexpr-контексте.
Вроде, нет никакой сложности сделать compile-time strtol 
https://godbolt.org/z/1oejY6Wd1
Похожие вопросы