考虑以下场景:
我需要处理水果,大多数时候我得到组合[但不总是,让我们假设],所以我创建enum
如下所示:
enum class ProcessInputFruits {None, Apples, Mangoes, PineApples, Grapes, GrapesAndMangoes, ApplesAndPineApples, All};
在我的函数ProcessFruits
中,我将这个enum
作为参数传递,但同时我想返回已处理的水果的类型。[它总是只处理一种类型,即使给定一个组合…假设)
因为我只需要返回单一类型,所以我创建了另一个包含ProcessedOutFruit
的enum
。
enum class ProcessedOutFruit {None, Apples, Mangoes, PineApples, Grapes};
这是我的功能
ProcessFruits(ProcessInputFruits& inputFruits, ProcessedOutFruit& outputFruits) {
if(inputFruits == ProcessInputFruits::GrapesAndMangoes ||
inputFruits == ProcessInputFruits::All) {
if(someCondtion) outputFruits = ProcessedOutFruit::Grapes;
if(anotherCondition) outputFruits = ProcessedOutFruit::Mangoes;
}
return ALL_GOOD_HERE;
}
问题:有没有更好的方法?
- 我们可以有一个
enums
的子集,这样我就可以表示1st enum as superset of 2nd enum
了吗? - 我可以使用输入参数来更新结果并发回[可能是一个糟糕的设计]
- 需要更新函数签名吗?请建议一个更好的。
我想达到的目标:
我正在维护两个不同的枚举类,其中包含我想要避免的几乎相似的值。但是当我想到合并这两个枚举类时,它会带走函数签名
的可读性/清晰度。请建议。
谢谢。
能够检测重叠元素的一种方法是,您可以定义这样的枚举:
enum class Fruits {
None = 0,
Apple = 1 << 0,
Grape = 1 << 1,
Mango = 1 << 2,
/* Others */
// You can define their overlap but it's not needed
All = Apple | Grape | Mango,
};
这样每个位表示enum
是否有给定的果实。您可以使用enumVar & Fruits::Mango
测试单个水果,或者使用enumVar & (Fruits::Mango | Fruits::Apple)
测试多个水果。你也可以通过enumVar == Fruits::Mango
检查它是否只是一个单一的水果。