enum class SomeEnum { ONE, TWO, THREE } ;
template < typename Enum>
class Flags {
Flags( const Flags& f) { } ;
Flags( Enum e) { } ;
Flags& operator | = ( Flags< Enum> f) {
//...;
return * this ;
}
friend Flags operator | ( Enum a, Flags b) { return b | a; }
friend Flags operator | ( Flags a, Enum b) { return a | = b; }
} ;
int main( ) {
Flags< SomeEnum> flags = SomeEnum:: ONE | SomeEnum:: TWO ;
return 0 ;
}
ZW51bSBjbGFzcyBTb21lRW51bSB7IE9ORSwgVFdPLCBUSFJFRSB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRW51bT4KY2xhc3MgRmxhZ3MgewogICAgRmxhZ3MoY29uc3QgRmxhZ3MmIGYpIHsgfTsKICAgIEZsYWdzKEVudW0gZSkgeyB9OwoKICAgIEZsYWdzJiBvcGVyYXRvciB8PShGbGFnczxFbnVtPiBmKSB7CiAgICAgICAgLy8uLi47CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCmZyaWVuZCBGbGFncyBvcGVyYXRvciB8KEVudW0gYSwgRmxhZ3MgYikgeyByZXR1cm4gYiB8IGE7IH0KZnJpZW5kIEZsYWdzIG9wZXJhdG9yIHwoRmxhZ3MgYSwgRW51bSBiKSB7IHJldHVybiBhIHw9IGI7IH0KfTsKCgppbnQgbWFpbigpIHsKICAgIEZsYWdzPFNvbWVFbnVtPiBmbGFncyA9IFNvbWVFbnVtOjpPTkUgfCBTb21lRW51bTo6VFdPOwogICAgcmV0dXJuIDA7Cn0=