我有一个位标志枚举
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
。这是我目前的方法,但我更喜欢看到代码,而不是抽象。
您可以使用函子来包装要应用的操作。您还需要注意,条件运算符的结果类型是其最后两个操作数的公共类型。我们可以使用
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);
但是,不使用函数是您不使用函数的原因。如果不将它们包装在某些函数或类似函数中,则无法通过三元运算符在
|=
和 &=
之间进行选择。