9 votes

constexpr log10 Fonction pour les entiers

J'ai donc besoin log10 pour trouver le nombre de caractères nécessaires pour stocker un nombre entier donné. Mais j'aimerais qu'elle détermine à la compilation la longueur des tableaux de caractères de manière statique sur la base de ces constantes d'entiers définies dans mon code. Malheureusement log10 n'est pas un constexpr même la version entière. Je pourrais faire une version intégrale comme celle-ci :

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;
}

Ce qui me permettra enfin de le faire : const char foo[intlen(13) + 1U]
Fait c++ m'a déjà donné un outil pour cela ou dois-je définir mon propre outil ?

5voto

Dan M. Points 2365

Si vous souhaitez uniquement obtenir le nombre maximum de chiffres (base10) pour un type d'intégrale (et de virgule flottante) donné (et non une valeur spécifique, c'est-à-dire suffisamment pour toutes les valeurs), vous pouvez utiliser : std::numeric_limits::max_digits10 y std::numeric_limits::digits10

La valeur de std::numeric_limits::max_digits10 est le nombre de chiffres en base 10 nécessaires pour représenter de manière unique toutes les valeurs distinctes du type T

La valeur de std::numeric_limits::digits10 est le nombre de chiffres en base 10 qui peuvent être représentés par le type T sans changement, c'est-à-dire que tout nombre avec ce nombre de chiffres décimaux significatifs peut être converti en une valeur de type T et revenir à la forme décimale, sans changement dû à l'arrondi ou au débordement.

Toutefois, si vous souhaitez trouver constexpr Pour déterminer la "longueur" d'une constante spécifique, vous devrez utiliser votre fonction personnalisée.

2voto

Jarod42 Points 15729

std::log10 doit être non constexpr par norme.

Comme il n'y a pas d'alternative à constexpr, vous devez écrire votre propre version (ou utiliser une bibliothèque qui en fournit une).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X