En recherchant un modèle is_complete dans la bibliothèque Boost, il est devenu évident qu'un tel modèle n'existe pas dans Boost.TypeTraits. Cela soulève des questions sur la raison de son absence et sur la conception potentielle d'un tel modèle.
Considérez l'extrait de code suivant :
<code class="cpp">//! Check whether type complete template<typename T> struct is_complete { static const bool value = ( sizeof(T) > 0 ); }; ... // use it in such a way BOOST_STATIC_ASSERT( boost::is_complete<T>::value );</code>
Ce code est défectueux car il applique sizeof à un type incomplet. est illégal. Par conséquent, une solution alternative est recherchée.
Une approche possible implique l’utilisation de SFINAE. Cependant, cela pose une limitation car cela ne peut généralement pas résoudre le problème sans violer la règle de définition unique (ODR).
Une solution spécifique à la plateforme proposée par Alexey Malistov est disponible pour MSVC avec une légère modification :
<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>
Malheureusement, l'utilisation de la macro __COUNTER__ n'est pas standardisée, ce qui limite potentiellement son applicabilité sur différents compilateurs.
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!