constexpr log10 Функция для целых чисел - PullRequest
0 голосов
/ 01 октября 2018

Так что мне нужна функция log10, чтобы найти количество символов, необходимое для хранения заданного целого числа.Но я хотел бы получить его во время компиляции, чтобы определить длину массивов символов статически на основе этих целочисленных констант, определенных в моем коде.К сожалению, log10 - это не constexpr функция, даже целочисленная версия.Я мог бы сделать интегральную версию, подобную этой:

template <typename T>
constexpr enable_if_t<is_integral_v<T>, size_t> intlen(T param) {
    size_t result{ 1U };

     while(T{} != (param /= T{ 10 })) ++result;
     return result;
}

, что в конечном итоге позволит мне сделать: const char foo[intlen(13) + 1U]
Имеет ли уже инструмент для этого или ядолжен определить мой собственный?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

std::log10 должно быть нет constexpr по стандарту.

Поскольку альтернативы constexpr нет, вы должны написать свою собственную версию (или использовать библиотеку, которая ее предоставляет).

0 голосов
/ 01 октября 2018

Если вы хотите получить только максимальные цифры (base10) для данного целочисленного (и с плавающей запятой) типа (не конкретного значения, т.е. достаточно для всех значений), вы можете использовать: std :: numeric_limits :: max_digits10 и std :: numeric_limits :: digits10

Значение std :: numeric_limits :: max_digits10 - это число из 10 цифр, которые необходимы для уникального представления всехотличные значения типа T

Значение std :: numeric_limits :: digits10 - это число цифр из 10 оснований, которые могут быть представлены типом T без изменений, то есть любое число с таким значительным числомдесятичные цифры могут быть преобразованы в значение типа T и обратно в десятичную форму, без изменений из-за округления или переполнения.

Однако, если вы хотите найти constexpr "длину" определенногоконстанта, вам придется использовать вашу пользовательскую функцию.

...