首页 > 解决方案 > 公开一个类内部的私有 std::bitset 字段以进行修改

问题描述

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

假设我有一个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)]; }

还没剪;它公开各个位以供读取但不用于写入。

标签: c++enum-classstd-bitset

解决方案


for operator[]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


推荐阅读