Под впечатлением от решения подобной проблемы на стороне свифта, с помощью magic_enum был написан простой враппер над std::bitset, идея простая, в std::bitset поменять тип аргумента с std::size_t на enum class. Размер std::bitset можно вычислить с помощью magic_enum.
Из плюсов тут то, что нет требования к значениям enum, что они должны быть степенями двойки, но есть требования этим значениям вообще ничего не присваивать, чтобы они определялись автоматически, иначе беда. Ждем рефлексию чтоб такое можно было делать более безопасно.
Hidden text
template <class Enum, std::size_t Size = magic_enum::enum_count<Enum>()>
class OptionSet {
std::bitset<Size> _bits;
public:
OptionSet() = default;
OptionSet(Enum e) {
set(e);
}
OptionSet(std::initializer_list<Enum> list) {
for (auto e : list) {
set(e);
}
}
constexpr typename std::bitset<Size>::reference operator[](Enum e) {
return _bits[std::to_underlying(e)];
}
constexpr bool operator[](Enum e) const {
return _bits.test(std::to_underlying(e));
}
// Далее врапим все методы std::bitset
};
Information
Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Под впечатлением от решения подобной проблемы на стороне свифта, с помощью magic_enum был написан простой враппер над std::bitset, идея простая, в std::bitset поменять тип аргумента с std::size_t на enum class. Размер std::bitset можно вычислить с помощью magic_enum.
Из плюсов тут то, что нет требования к значениям enum, что они должны быть степенями двойки, но есть требования этим значениям вообще ничего не присваивать, чтобы они определялись автоматически, иначе беда. Ждем рефлексию чтоб такое можно было делать более безопасно.
Hidden text