Déterminer si un type est complet est un aspect crucial de la programmation. Bien que la bibliothèque Boost propose une large gamme de TypeTraits, il existe une absence notable de modèle is_complete. Cet article explore pourquoi un tel modèle est manquant et propose une solution qui utilise SFINAE.
Le défi immédiat dans la définition d'un modèle is_complete réside dans le fait que l'application de sizeof à un modèle incomplet le type est illégal. Cette restriction découle de la possibilité d'ambiguïtés et de comportements indéfinis résultant de l'absence d'une taille d'objet valide.
Pour contourner cette limitation, Alexey Malistov a proposé une plate-forme- solution spécifique qui exploite les macros spécifiques au compilateur. Son approche repose sur la macro __COUNTER__, qui s'incrémente à chaque invocation de macro. Cela permet la construction d'un modèle avec un paramètre factice unique pour chaque type testé.
Le code de cette solution ressemble à ceci :
<code class="cpp">namespace { template<class T, int discriminator> struct is_complete { static T & getT(); static char (& pass(T))[2]; static char pass(...); static const bool value = sizeof(pass(getT()))==2; }; } #define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
En définissant is_complete comme modèle de classe imbriquée et en utilisant la macro __COUNTER__ comme discriminateur, il devient possible de vérifier l'exhaustivité du type d'une manière spécifique à la plate-forme. La fonction pass sert d'argument factice pour appliquer sizeof et différencier les types complets et incomplets.
Alors que le mécanisme SFINAE (Substitution Failure is Not an Error) est couramment utilisé pour activer ou désactiver la spécialisation de modèle en fonction des propriétés de type, elle ne peut pas être directement appliquée pour vérifier l'exhaustivité du type. La raison en est que is_complete doit être évalué comme une constante, pas comme un type.
L'absence d'un modèle is_complete standard dans la bibliothèque Boost est due aux défis posés par l'application de sizeof aux types incomplets et aux limites de SFINAE. Cependant, des solutions spécifiques à la plate-forme, comme celle proposée par Alexey Malistov, peuvent constituer un moyen pratique de vérifier l'exhaustivité des types dans certains environnements.
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!