公开 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
我正在一个尚未超越 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