#include <bitset>
#include <string>
#include <type_traits>
#define SetBit(x) (0x1u << x)
enum Test : uint32_t {
kNum0 = SetBit(0),
kNum1 = SetBit(1),
kNum2 = SetBit(2),
kNum3 = SetBit(3),
kNum4 = SetBit(4),
};
template<class Type>
struct MakeBitSet {
template <class Args0>
static auto Or(Args0 args0) { return args0; }
template <class Args0, class... Args>
static auto Or(Args0 args0, Args... args) {
return args0 | Or(args...);
}
template <class Args0, class... Args>
static auto Create(Args0 args0, Args... args) {
using T = typename std::underlying_type<Type>::type;
T value = Or(args0, args...);
return std::bitset<sizeof(T) * 8>{value};
}
};
int main() {
using TestToBitSet = MakeBitSet<Test>;
auto bs = TestToBitSet::Create(Test::kNum4);
auto bs1 = TestToBitSet::Create(Test::kNum4, Test::kNum3);
auto bs11 = TestToBitSet::Create(Test::kNum4, Test::kNum0, Test::kNum1);
auto bs2 = TestToBitSet::Create(Test::kNum4, Test::kNum0, Test::kNum1,
Test::kNum2, Test::kNum3);
printf("sizeof:%d, %d, %s\n", sizeof bs, bs.size(), bs.to_string().c_str());
for (int cursor = 0, is_set = 0; cursor < bs.size() && is_set < bs.count(); ++cursor) {
printf("xx\n");
if (!bs.test(cursor)) {
continue;
}
is_set++;
}
return 0;
}
#include <bitset>
#include <memory>
#include <type_traits>
enum XgCmd {
DO_NONE_NLOG,
DO_NONE,
REQ_CDN,
REQ_RANGE,
REQ_CHUNK,
OPEN_DRIP_CHUNK,
OPEN_STEL_CHUNK,
OPEN_BKJ_RANGE,
STOP_P2P,
STOP_CDN,
};
template <class Type> struct MakeBitSet {
using Element_Type = typename std::underlying_type<Type>::type;
using BitSet_Type = std::bitset<sizeof(Element_Type) * 8>;
template <class Args0>
static BitSet_Type SetBit(BitSet_Type bitset, Args0 args0) {
return bitset.set(args0, true);
}
template <class Args0, class... Args>
static BitSet_Type SetBit(BitSet_Type bitset, Args0 args0, Args... args) {
return SetBit(bitset.set(args0), args...);
}
template <class Args0, class... Args>
static auto Create(Args0 args0, Args... args) {
BitSet_Type bs;
return SetBit(bs, args0, args...);
}
};
using XgCmdSet = std::bitset<sizeof(XgCmd) * 8>;
using MakeCmdSet = MakeBitSet<XgCmd>;
int main() {
auto bs = MakeCmdSet::Create(DO_NONE_NLOG);
printf("%u %s", bs.size(), bs.to_string().c_str());
return 0;
}
D:\CLionProjects\untitled\cmake-build-debug\untitled.exe
sizeof:4, 32, 00000000000000000000000000010000
xx
xx
xx
xx
xx
备份地址: 【利用模版将多enum转为BitSet】