I've interesting how this thing is work on theory. Example:
#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;
}
I try to explore source code but it was too hard (macros + templates code navigation fails). Someone can get theory exploration how it works? I've have no ideas how it can be implemented.
You're running into a lot of macros because Boost is switching between compiler intrinsics for all the platforms it supports. For instance, Visual C++ defines __is_enum(T) which will returns true if T is an enum and false otherwise. MSDN has a list of such intrinsics that Visual C++ implements for type trait support.
is_enum is now part of C++11, and is included in the type_traits header. Looking through your standard library implementation will most likely be easier than the Boost headers.
EDIT:
I found the Boost implementation; it is located in <boost_path>\boost\type_traits\intrinsics.hpp. Search this file for BOOST_IS_ENUM in this file and you'll see the compiler intrinsic implemented by various compilers. Interestingly enough, it seems all of them implement this particular one as __is_enum(T).
boost::is_enum is implemented like std::is_enum. It requires some compiler magic. Check the following link which has the same question, and an implementation: is_enum implementation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With