公开 class 内的私有 std::bitset 字段以供修改

Expose a private std::bitset field that is inside a class for modification

我正在一个尚未超越 C++11 的 C++ 项目中编码。

假设我有一个 enum class 如下:

enum class Weekdays
{
    kSunday = 0,
    kMonday,
    ...
    kSaturday,
};

我想创建一个 class,它有一个私人 std::bitset 字段,用于跟踪哪些工作日是特殊的。这个 class 也做了很多其他事情,所以我不能或不应该直接使用 std::bitset<7u>。所以我定义:

class Foo
{
private:
    std::bitset<7u> _specialflags;
    
public:
    ... (*)
}

我想使用这个class的方式如下

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];
}

那么我必须在 (*) 处插入什么才能像那样使用 class?特别是,我想将 (!) 分配给 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 return 是 std::bitset::reference。所以如果你有你的函数 return 那,你可以直接修改位集中的值!例如:

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