fork(4) download
  1. #include <type_traits>
  2. #include <bitset>
  3. #include <iostream>
  4.  
  5. template< typename >
  6. struct enum_traits;
  7.  
  8. enum class mood_flag {
  9. jumpy,
  10. happy,
  11. upset,
  12. count // size of enumeration
  13. };
  14.  
  15. template<>
  16. struct enum_traits< mood_flag > {
  17. static constexpr bool bit_index = true;
  18. };
  19.  
  20. template< typename t >
  21. struct flag_bits : std::bitset< static_cast< int >( t::count ) > {
  22. flag_bits( t bit ) // implicit
  23. : flag_bits::bitset( 1 << static_cast< int >( bit ) ) {}
  24.  
  25. flag_bits( typename flag_bits::bitset set )
  26. : flag_bits::bitset( set ) {}
  27. };
  28.  
  29. template< typename e >
  30. typename std::enable_if< enum_traits< e >::bit_index,
  31. flag_bits< e > >::type
  32. operator | ( flag_bits< e > set, e next )
  33. { return set | flag_bits< e >( next ); }
  34.  
  35. template< typename e >
  36. typename std::enable_if< enum_traits< e >::bit_index,
  37. flag_bits< e > >::type
  38. operator | ( e first, e next )
  39. { return flag_bits< e >( first ) | next; }
  40.  
  41. int main() {
  42. std::cout << ( mood_flag::jumpy | mood_flag::upset ) << '\n';
  43. }
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
101