微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

公开要修改的类内部的私有std :: bitset字段

如何解决公开要修改的类内部的私有std :: bitset字段

我在一个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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。