一个班轮可与两个不同的操作员一起操作

问题描述 投票:0回答:1

我有一个位标志枚举

EFlags
。给定一个条件,我想删除一个标志或添加一个标志。我定义了运算符
|=
来添加标志,并定义了
&=
来删除标志。例如,假设条件是
bool b_condition
:

EFlags flags;
bool b_condition = true;

if(b_condition)
  flags |= EFlags::FLAG;
else
  flags &= EFlags::FLAG;

我可以使用以下内容轻松地将其转换为单衬:

b_condition ? (flags |= EFlags::FLAG) : (flags &= EFlags::FLAG);

我想知道是否有办法让

flags
位于一侧,而
EFlags::FLAG
位于另一侧。也就是说,只有运算符受三元影响:

flags (b_condition ? |= : &=) EFlags::FLAG;

此代码不正确。这是行不通的。我怎样才能做这样的事情?

我的推理:我有一行这样的内容(目前有 18 行),我相信它将极大地提高可读性,因为目前它看起来相当混乱,而且分析起来有点困难。另外,我不喜欢像

add_or_remove_flag_conditionally(EFlags& flag, EFlag modification_flag, bool b_add);
这样的函数,它会删除 if
b_add == false
。这是我目前的方法,但我更喜欢看到代码,而不是抽象。

c++ enums operators bitflags
1个回答
0
投票

您可以使用函子来包装要应用的操作。您还需要注意,条件运算符的结果类型是其最后两个操作数的公共类型。我们可以使用

std::function
来定义两个兼容的函数。为了减少开销的方法,您可能需要转向裸函数指针。

std::function<void(EFlags&,EFlags)> remove = [](EFlags& flags,EFlags a) { flags = a; };
std::function<void(EFlags&,EFlags)> add = [](EFlags& flags,EFlags a) { flags = a; };

bool condition = false;
EFlags flags,a;
(condition ? remove : add)(flags,a);

但是,不使用函数是您不使用函数的原因。如果不将它们包装在某些函数或类似函数中,则无法通过三元运算符在

|=
&=
之间进行选择。

© www.soinside.com 2019 - 2024. All rights reserved.