Automatisation de la conversion d'énumérations fortement typées en nombres entiers
En C, les énumérations se déclinent en deux versions : les énumérations fortement typées et les énumérations régulières. Les énumérations régulières peuvent être implicitement converties en entiers, tandis que les énumérations fortement typées nécessitent une conversion explicite. Cela soulève la question : existe-t-il un moyen automatisé de convertir des énumérations fortement typées en entiers sans recourir à des conversions explicites ?
La réponse est non, et elle est intentionnelle. Les énumérations fortement typées sont conçues pour empêcher la conversion implicite en nombres entiers. Essentiellement, le compilateur garantit que vous reconnaissez explicitement la conversion d'une valeur énumérée en un entier.
Cependant, il existe une solution de contournement pour éviter de spécifier le type sous-jacent dans la conversion. En utilisant une fonction de modèle, nous pouvons faire abstraction de la spécification de type de la distribution.
<code class="cpp">template <typename E> constexpr typename std::underlying_type<E>::type to_underlying(E e) noexcept { return static_cast<typename std::underlying_type<E>::type>(e); }</code>
Avec cette fonction de modèle, la conversion peut être réalisée comme suit :
<code class="cpp">std::cout << foo(to_underlying(b::B2)) << std::endl;</code>
Cette approche élimine le spécification de type explicite dans le cast, simplifiant le processus de conversion tout en conservant le comportement souhaité de conversion explicite forcée pour les énumérations fortement typées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!