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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…