Return 来自 operator[] 的引用使用位集适配器

Return reference from operator[] using a bitset adapter

我正在使用 std::bitset 和枚举 class 以获得更方便的工具。但是当 returning 来自 operator[]:

的值时,我遇到了一个编译错误
error: non-const lvalue reference to type 'bool' cannot bind to a temporary of type 'std::__1::bitset<2>::reference' (aka '__bit_reference<std::__1::__bitset<1, 2> >')

我必须通过引用 return 它才能为其赋值。这是我的完整代码:

template<typename T>
struct EnumTraits;

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

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

public:
  bool& operator[](T pos)
  {
    return m_bitset[get_value(pos)];
  }

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

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

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

enum class BitFlags
{
    Write,
    Read,
    NumOfFlags
};

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

以下是我尝试使用它的方式:

EnumClassBitset<BitFlags> m_flags;
m_flags[BitFlags::Write] = true;
cout << "Write flag: " << m_flags[BitFlags::Write] << endl;

感谢任何帮助,提前致谢。

std::bitset(如 std::vector<bool>)不会 return 来自 operator[] 的非 const 版本的 bool &。这样做的原因是技术性的,因为 bool 变量是一个字节大而 std::bitset 的元素只有一个字节大。此外 bool 作为类型具有 1 个字节的对齐要求,但 std::bitset 中的单个位未对齐。所以正常的bool &不能引用这样的元素。

这就是 std::bitset::operator[] return 类型为 std::bitset::reference 的代理对象的原因。您可能必须转发此类型而不是 returning bool &.