Comment convertir des énumérations fortement typées en entiers de manière transparente
Classiquement, les énumérations pouvaient être implicitement converties en types entiers, facilitant ainsi une utilisation pratique. Cependant, les énumérations fortement typées, introduites en C 11, n'offrent pas cette flexibilité sans conversion explicite. Cette différence découle de l'intention d'éviter les conversions implicites accidentelles, en respectant les mesures de sécurité du C moderne.
Pour réaliser la conversion souhaitée sans conversion manuelle, vous avez deux options :
Définissez une fonction de modèle générique qui récupère automatiquement le type sous-jacent d'une énumération et effectue la conversion. Cette approche élimine le besoin de spécifier le type de cible dans 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>
Utilisation :
<code class="cpp">std::cout << foo(to_underlying(b::B2)) << std::endl;
Cette approche consiste à convertir la valeur enum fortement typée en une instance de son type sous-jacent à l'aide de std::underlying_type:
<code class="cpp">std::cout << foo(static_cast<std::underlying_type<b>::type>(b::B2)) << std::endl;</code>
Bien que la première option offre une plus grande flexibilité et une plus grande sécurité de type, la deuxième option est plus simple et concise. Les deux méthodes offrent des moyens efficaces pour convertir de manière transparente des valeurs d'énumération fortement typées en nombres entiers, conformément à la philosophie C moderne des conversions de types explicites.
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!