gpt4 book ai didi

c++ - 将枚举类与 std::bitset 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:46 24 4
gpt4 key购买 nike

首先我想要一个普通的枚举而不是基于位的枚举,因为不同枚举的数量将超出任何整数类型。我还想利用 C++11 enum class 的类型安全性。为此,自然选择 std::bitset,但我不知道如何将这两者绑定(bind)在一起。

需要自定义 bitset 吗?如何绕过这样一个类的实现?

最佳答案

由于 enum classes 是枚举的包装器,您可以将它们转换为基础类型。 并且使用一些私有(private)继承,您可以有选择地从 C++ stdlib 类中导入一些功能,而不必担心 Liskov 原则。 组合导致更清晰的代码。使用这些功能,我们可以包装 std::bitset。以下代码仅包含功能子集,但可以进一步扩展。

最大值存在问题 - 您无法获得 enum class 的最大值(或者我错了吗?)。所以我添加了 EnumTraits。现在,在使用类之前,用户需要将 EnumTraits 的常量值 max 特化为枚举的最大值。

#include <bitset>
#include <type_traits>

template<typename T>
struct EnumTraits;

template<typename T>
class EnumClassBitset
{
private:
std::bitset<static_cast<typename std::underlying_type<T>::type>(EnumTraits<T>::max)> c;

typename std::underlying_type<T>::type get_value(T v) const
{
return static_cast<typename std::underlying_type<T>::type>(v);
}

public:
EnumClassBitset() : c()
{

}

bool test(T pos) const
{
return c.test(get_value(pos));
}

EnumClassBitset& reset(T pos)
{
c.reset(get_value(pos));
return *this;
}

EnumClassBitset& flip(T pos)
{
c.flip(get_value(pos));
return *this;
}
};

enum class BitFlags
{
False,
True,
FileNotFound,
Write,
Read,
MaxVal
};

template<>
struct EnumTraits<BitFlags>
{
static const BitFlags max = BitFlags::MaxVal;
};

#include <iostream>

int main()
{
EnumClassBitset<BitFlags> f;
f.flip(BitFlags::True);
f.flip(BitFlags::FileNotFound);
//f.flip(2); //fails to compile
std::cout << "Is False? " << f.test(BitFlags::False) << "\n";
std::cout << "Is True? " << f.test(BitFlags::True) << "\n";
std::cout << "Is FileNotFound? " << f.test(BitFlags::FileNotFound) << "\n";
std::cout << "Is Write? " << f.test(BitFlags::Write) << "\n";
std::cout << "Is Read? " << f.test(BitFlags::Read) << "\n";
}

不幸的是,由于 enum 没有太多功能,更重要的是,带有 enum classes 的 C++11 并没有改善这种情况,some programmers use static map wrapped in a class. Definitely a good read.

关于c++ - 将枚举类与 std::bitset 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17350214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com