#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