c++ - 公开一个类内部的私有 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)]; }
还没剪;它公开各个位以供读取但不用于写入。
解决方案
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
推荐阅读
- c# - 如何在 C# 中使用指针和回调声明外部方法
- arrays - 如何从 Swift 中的数组以编程方式在堆栈中创建按钮
- ruby - 是否有可能使用 Ruby+Minitest 编写参数化测试?
- pandas - tf.keras.model.fit 需要很长时间
- php - 在产品页面 Opencart 3 上显示类别
- python - 有没有办法使用 pyswip 和 Flask?
- python - 不符合 Python 变量限制的 Scrapy 字段名称
- python - 如何从python中的列表中删除撇号?
- r - 使用循环和条件管理数据框
- php - Laravel/PHP:包含(.../Controller.php):无法打开流:权限被拒绝