J'ai intéressant comment cette chose travaille sur la théorie. Exemple:
#include <boost/type_traits/is_enum.hpp> #include <iostream> enum foo { AAA, BBB }; typedef foo bar; struct sfoo { enum bar { CCC }; }; int main() { std::cout << boost::is_enum<foo>::value << "\n"; // 1 std::cout << boost::is_enum<bar>::value << "\n"; // 1 std::cout << boost::is_enum<sfoo>::value << "\n"; // 0 std::cout << boost::is_enum<int>::value << "\n"; // 0 std::cout << boost::is_enum<sfoo::bar>::value << "\n"; // 1 return 0; }
3 Réponses :
boost :: is_enum code> est implémenté comme
std :: is_enum code>. Cela nécessite une magie de compilateur. Vérifiez le lien suivant qui a la même question et une implémentation: implémentation IS_ENUM P>
Le compilateur Magic peut être le moyen le plus simple et le meilleur moyen de la mettre en œuvre, mais ce n'est pas nécessaire et la mise en œuvre de Boost fonctionne sur les compilateurs qui n'ont pas la magie du compilateur.
Vous rencontrez beaucoup de macros, car boost bascule entre le compilateur intrinsèque pour toutes les plates-formes qu'elle prend en charge. Par exemple, Visual C ++ définit EDIT: strong> __ is_enum (t) code> qui retourne
true code> si
t code> est un
Enum code> et
faux code> sinon. MSDN a un Liste de ces intrinsèques visuels C ++ implémente pour le support de trait de type . p>
is_enum code>
fait maintenant partie de c + +11, et est inclus dans la type_traits code> en-tête. En examinant la mise en œuvre de votre bibliothèque standard, sera probablement plus facile que les en-têtes de boost. P>
J'ai trouvé la mise en œuvre de Boost; Il est situé dans
boost_is_enum code> dans ce fichier et vous verrez le compilateur intrinsèque implémenté par divers compilateurs. Il y a assez de choses, il semble que tous implémentent ce particulier comme
__ is_enum (t) code>. P>
Je n'ai pas suivi le code de boost en détail, mais cela semble utiliser une élimination simple: une énumération n'est pas arithmétique (entiers intégrés et types de points flottants et de pointeurs), pas une référence, pas un fonction, pas une classe ou un syndicat et non un tableau. P>
Cela a déjà été posé Stackoverflow.com/questions/4705316/...
Merci, il semble que j'utilise une mauvaise demande de recherche avant de créer une question.