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 &
.
我正在使用 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 &
.