cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
88 stars 0 forks source link

constexpr `to_chars`/`from_chars` #453

Closed Neargye closed 2 years ago

Neargye commented 3 years ago

Хотелось бы иметь стандартный способ перевести строку в число и обратно на этапе компиляции. Сейчас для этого приходится либо писать свои реализации, либо брать что-то из boost/etc.

constexpr std::optional<int> to_int(std::string_view s) {
    int value;

    if (auto [p, err] = std::from_chars(s.begin(), s.end(), value); err == std::errc{}) {
        return value;
    } else {
        return std::nullopt;
    }
}

static_assert(to_int("42") == 42);
static_assert(to_int("foo") == std::nullopt);

Пропозл для целочисленных числес сейчас находится в работе: https://github.com/cplusplus/papers/issues/984 https://wg21.link/p2291

incoder1 commented 3 years ago

Несколько раз порывался это написать и пришел к выводу что в этом нет смысла. В подавляющем большинстве случаев операции преобразования к строке и из строки производятся при операциях ввода/ вывода. То есть при чтении и записи в файлы и сокеты в текстовых форматах (CSV,XML,HTML,JSON,YAML и т.д.) Тут от constexpr вообще нет толку, эти операции происходят в runtime. А с вещественными числами типа float,double,long double вообще крайне сложно без С библиотеки выполнить преобразование, если операции делать без ассемблерных команд то получится крайне не производительный код потому что не будет задействовано "ускорительное железо". Стандартная библиотека С как правило содержит весьма оптимизированный ассемблерный код под целевую платформу. 2. В программе если есть константы которые нужно в файл/cокет писать как значения по умолчанию - лучше сразу строковым литералом и задавать. И время компиляции уменьшиться, и читать код проще будет. Однако даже если этого не делать, компиляторы умеют хорошо оптимизировать такие преобразования и сами подставлять уже преобразованные значения.