问题描述
我在一个C ++项目中进行编码,该项目尚未超越C ++ 11。
假设我有一个enum class
,如下所示:
enum class Weekdays
{
kSunday = 0,kMonday,...
kSaturday,};
我想创建一个具有私有std::bitset
字段的类,该字段跟踪哪个工作日是特殊的。此类也做很多其他事情,因此我不能或不应该直接使用std::bitset<7u>
。所以我定义:
class Foo
{
private:
std::bitset<7u> _specialflags;
public:
... (*)
}
我要使用此类的方法如下
void f()
{
Foo obj;
...
bool monday_is_special = obj[kMonday];
// ... cue some calculations that show that Tuesday is just as
// special as Monday is ...
obj[kTuesday] = obj[kMonday];
}
那么我必须在(*)处插入什么才能使用这样的类?特别是,我想将(!)分配给obj[kTuesday]
并得到这样的效果,即在obj
内部,字段_specialflags[static_cast<size_t>(kTuesday)]
被相应地修改了。所以像
inline bool operator[](Weekdays d) const { return _specialflags[static_cast<size_t>(d)]; }
还没有削减;它公开了各个位供读取,而不供写入。
解决方法
operator[]
for bitset返回一个std::bitset::reference
。因此,如果您有返回的函数,则可以直接修改位集中的值!例如:
enum class Weekdays
{
kSunday = 0,...,kSaturday,COUNT
};
class Foo {
private:
std::bitset<(ulong)Weekdays::COUNT> weekdayFlags;
public:
std::bitset<(ulong)Weekdays::COUNT>::reference operator[](Weekdays day) {
return weekdayFlags[(size_t)day];
}
};
在此处查看实际操作:https://ideone.com/3yiG3C