- #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=