#include <type_traits>
#include <bitset>
#include <iostream>
template< typename >
struct enum_traits;
// Lots of components
enum class components {
comp_01, comp_02, comp_03, comp_04, comp_05, comp_06, comp_07, comp_08, comp_09, comp_10,
comp_11, comp_12, comp_13, comp_14, comp_15, comp_16, comp_17, comp_18, comp_19, comp_20,
comp_21, comp_22, comp_23, comp_24, comp_25, comp_26, comp_27, comp_28, comp_29, comp_30,
comp_31, comp_32, comp_33, comp_34, comp_35, comp_36, comp_37, comp_38, comp_39, comp_40,
comp_41, comp_42, comp_43, comp_44, comp_45, comp_46, comp_47, comp_48, comp_49, comp_50,
comp_51, comp_52, comp_53, comp_54, comp_55, comp_56, comp_57, comp_58, comp_59, comp_60,
comp_61, comp_62, comp_63, comp_64, comp_65, comp_66, comp_67, comp_68, comp_69, comp_70,
count // size of enumeration
};
template<>
struct enum_traits< components > {
static constexpr bool bit_index = true;
};
template< typename t >
struct flag_bits : std::bitset< static_cast< int >(t::count) > {
flag_bits(t bit) // implicit
{ this->set( 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 << (components::comp_01 | components::comp_50) << '\n';
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgPgpzdHJ1Y3QgZW51bV90cmFpdHM7CgovLyBMb3RzIG9mIGNvbXBvbmVudHMKZW51bSBjbGFzcyBjb21wb25lbnRzIHsKCWNvbXBfMDEsIGNvbXBfMDIsIGNvbXBfMDMsIGNvbXBfMDQsIGNvbXBfMDUsIGNvbXBfMDYsIGNvbXBfMDcsIGNvbXBfMDgsIGNvbXBfMDksIGNvbXBfMTAsCgljb21wXzExLCBjb21wXzEyLCBjb21wXzEzLCBjb21wXzE0LCBjb21wXzE1LCBjb21wXzE2LCBjb21wXzE3LCBjb21wXzE4LCBjb21wXzE5LCBjb21wXzIwLAoJY29tcF8yMSwgY29tcF8yMiwgY29tcF8yMywgY29tcF8yNCwgY29tcF8yNSwgY29tcF8yNiwgY29tcF8yNywgY29tcF8yOCwgY29tcF8yOSwgY29tcF8zMCwKCWNvbXBfMzEsIGNvbXBfMzIsIGNvbXBfMzMsIGNvbXBfMzQsIGNvbXBfMzUsIGNvbXBfMzYsIGNvbXBfMzcsIGNvbXBfMzgsIGNvbXBfMzksIGNvbXBfNDAsCgljb21wXzQxLCBjb21wXzQyLCBjb21wXzQzLCBjb21wXzQ0LCBjb21wXzQ1LCBjb21wXzQ2LCBjb21wXzQ3LCBjb21wXzQ4LCBjb21wXzQ5LCBjb21wXzUwLAoJY29tcF81MSwgY29tcF81MiwgY29tcF81MywgY29tcF81NCwgY29tcF81NSwgY29tcF81NiwgY29tcF81NywgY29tcF81OCwgY29tcF81OSwgY29tcF82MCwKCWNvbXBfNjEsIGNvbXBfNjIsIGNvbXBfNjMsIGNvbXBfNjQsIGNvbXBfNjUsIGNvbXBfNjYsIGNvbXBfNjcsIGNvbXBfNjgsIGNvbXBfNjksIGNvbXBfNzAsCgljb3VudCAvLyBzaXplIG9mIGVudW1lcmF0aW9uCn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBlbnVtX3RyYWl0czwgY29tcG9uZW50cyA+IHsKCXN0YXRpYyBjb25zdGV4cHIgYm9vbCBiaXRfaW5kZXggPSB0cnVlOwp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIHQgPgpzdHJ1Y3QgZmxhZ19iaXRzIDogc3RkOjpiaXRzZXQ8IHN0YXRpY19jYXN0PCBpbnQgPih0Ojpjb3VudCkgPiB7CglmbGFnX2JpdHModCBiaXQpIC8vIGltcGxpY2l0CgkJeyB0aGlzLT5zZXQoIHN0YXRpY19jYXN0PCBpbnQgPiggYml0ICkgKTsgfQoKCWZsYWdfYml0cyh0eXBlbmFtZSBmbGFnX2JpdHM6OmJpdHNldCBzZXQpCgkJOiBmbGFnX2JpdHM6OmJpdHNldChzZXQpIHt9Cn07Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgZSA+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBlbnVtX3RyYWl0czwgZSA+OjpiaXRfaW5kZXgsCglmbGFnX2JpdHM8IGUgPiA+Ojp0eXBlCglvcGVyYXRvciB8IChmbGFnX2JpdHM8IGUgPiBzZXQsIGUgbmV4dCkKewoJCXJldHVybiBzZXQgfCBmbGFnX2JpdHM8IGUgPihuZXh0KTsKfQoKdGVtcGxhdGU8IHR5cGVuYW1lIGUgPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgZW51bV90cmFpdHM8IGUgPjo6Yml0X2luZGV4LAoJZmxhZ19iaXRzPCBlID4gPjo6dHlwZQoJb3BlcmF0b3IgfCAoZSBmaXJzdCwgZSBuZXh0KQp7CgkJcmV0dXJuIGZsYWdfYml0czwgZSA+KGZpcnN0KSB8IG5leHQ7Cn0KCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8IChjb21wb25lbnRzOjpjb21wXzAxIHwgY29tcG9uZW50czo6Y29tcF81MCkgPDwgJ1xuJzsKfQ==