How can I use an enum class in a boolean context?

后端 未结 7 1901
醉酒成梦
醉酒成梦 2021-01-07 15:59

I have some generic code that works with flags specified using C++11 enum class types. At one step, I\'d like to know if any of the bits in the flag are set. Cu

相关标签:
7条回答
  • 2021-01-07 17:00

    Is it possible to specify a custom function to evaluate a class enum in a boolean context?

    Yes, but not automatically. Manually calling a function is still more elegant than the other alternatives presented.

    Simply pick a nice function name, such as any, and implement it. Overload resolution will make sure your function plays well with all others.

    bool any( E arg )
        { return arg != E::none; }
    
    ...
    
    if ( any( flags ) ) {
        ...
    

    Looks nice enough to me.


    Update: if you want this to apply to several enumeration types, it can be templated:

    template< typename enum_type > // Declare traits type
    struct enum_traits {}; // Don't need to declare all possible traits
    
    template<>
    struct enum_traits< E > { // Specify traits for "E"
        static constexpr bool has_any = true; // Only need to specify true traits
    };
    
    template< typename enum_type > // SFINAE makes function contingent on trait
    typename std::enable_if< enum_traits< enum_type >::has_any,
        bool >::type
    any( enum_type e )
        { return e != enum_type::none; }
    

    I've been using this sort of mechanism for other things and never encountered any side effects or issues :v) .

    You could skip the trait and set the SFINAE condition to something like enum_type::none == enum_type::none, to merely check for the presence of none and the equality operator, but that would be less explicit and safe.

    0 讨论(0)
提交回复
热议问题