gpt4 book ai didi

c++ - 使用位集适配器从operator []返回引用

转载 作者:行者123 更新时间:2023-12-03 07:11:59 25 4
gpt4 key购买 nike

我使用带有枚举类的std::bitset来拥有更方便的工具。但是,当从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> >')
我必须通过引用将其返回,以便能够为其分配值。这是我的完整代码:
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>)不会从bool &的非const版本转换为operator[]。这样做的原因是技术性的,原因是bool变量只有一个字节,而std::bitset的元素只有一个字节。进一步的bool作为类型具有1字节的对齐要求,但是std::bitset中的单个位未对齐。因此,普通的bool &无法引用此类元素。
这就是 std::bitset::operator[] 返回std::bitset::reference类型的代理对象的原因。您可能必须转发这种类型,而不是返回bool &

关于c++ - 使用位集适配器从operator []返回引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64662134/

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