#include <type_traits>
#include <bitset>
#include <iostream>
template< typename >
struct enum_traits;
enum class mood_flag {
jumpy,
happy,
upset,
count // size of enumeration
};
template<>
struct enum_traits< mood_flag > {
static constexpr bool bit_index = true;
};
template< typename t >
struct flag_bits : std::bitset< static_cast< int >( t::count ) > {
flag_bits( t bit ) // implicit
: flag_bits::bitset( 1 << static_cast< int >( bit ) ) {}
flag_bits( typename flag_bits::bitset set )
: flag_bits::bitset( set ) {}
};
template< typename e >
typename std::enable_if< enum_traits< e >::bit_index,
flag_bits< e > >::type
operator | ( flag_bits< e > set, e next )
{ return set | flag_bits< e >( next ); }
template< typename e >
typename std::enable_if< enum_traits< e >::bit_index,
flag_bits< e > >::type
operator | ( e first, e next )
{ return flag_bits< e >( first ) | next; }
int main() {
std::cout << ( mood_flag::jumpy | mood_flag::upset ) << '\n';
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgPgpzdHJ1Y3QgZW51bV90cmFpdHM7CgplbnVtIGNsYXNzIG1vb2RfZmxhZyB7CiAgICBqdW1weSwKICAgIGhhcHB5LAogICAgdXBzZXQsCiAgICBjb3VudCAvLyBzaXplIG9mIGVudW1lcmF0aW9uCn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBlbnVtX3RyYWl0czwgbW9vZF9mbGFnID4gewogICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGJpdF9pbmRleCA9IHRydWU7Cn07Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgdCA+CnN0cnVjdCBmbGFnX2JpdHMgOiBzdGQ6OmJpdHNldDwgc3RhdGljX2Nhc3Q8IGludCA+KCB0Ojpjb3VudCApID4gewogICAgZmxhZ19iaXRzKCB0IGJpdCApIC8vIGltcGxpY2l0CiAgICAgICAgOiBmbGFnX2JpdHM6OmJpdHNldCggMSA8PCBzdGF0aWNfY2FzdDwgaW50ID4oIGJpdCApICkge30KICAgICAgICAKICAgIGZsYWdfYml0cyggdHlwZW5hbWUgZmxhZ19iaXRzOjpiaXRzZXQgc2V0ICkKICAgICAgICA6IGZsYWdfYml0czo6Yml0c2V0KCBzZXQgKSB7fQp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIGUgPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgZW51bV90cmFpdHM8IGUgPjo6Yml0X2luZGV4LAogICAgZmxhZ19iaXRzPCBlID4gPjo6dHlwZQpvcGVyYXRvciB8ICggZmxhZ19iaXRzPCBlID4gc2V0LCBlIG5leHQgKQogICAgeyByZXR1cm4gc2V0IHwgZmxhZ19iaXRzPCBlID4oIG5leHQgKTsgfQoKdGVtcGxhdGU8IHR5cGVuYW1lIGUgPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgZW51bV90cmFpdHM8IGUgPjo6Yml0X2luZGV4LAogICAgZmxhZ19iaXRzPCBlID4gPjo6dHlwZQpvcGVyYXRvciB8ICggZSBmaXJzdCwgZSBuZXh0ICkKICAgIHsgcmV0dXJuIGZsYWdfYml0czwgZSA+KCBmaXJzdCApIHwgbmV4dDsgfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OmNvdXQgPDwgKCBtb29kX2ZsYWc6Omp1bXB5IHwgbW9vZF9mbGFnOjp1cHNldCApIDw8ICdcbic7Cn0=