7
votes

Boost :: is_enum comment ça marche?

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;
}


2 commentaires

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.


3 Réponses :


2
votes

boost :: is_enum est implémenté comme std :: is_enum . 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


1 commentaires

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.



7
votes

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 __ is_enum (t) qui retourne true si t est un Enum et faux sinon. MSDN a un Liste de ces intrinsèques visuels C ++ implémente pour le support de trait de type .

is_enum fait maintenant partie de c + +11, et est inclus dans la type_traits 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.

EDIT:
J'ai trouvé la mise en œuvre de Boost; Il est situé dans \ boost \ type_traits \ intrinsics.hpp . Rechercher ce fichier pour boost_is_enum 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) .


0 commentaires

1
votes

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.


0 commentaires