在c++中按值或引用返回枚举,以及枚举子集的可能性



考虑以下场景:

我需要处理水果,大多数时候我得到组合[但不总是,让我们假设],所以我创建enum如下所示:

enum class ProcessInputFruits {None, Apples, Mangoes, PineApples, Grapes, GrapesAndMangoes, ApplesAndPineApples, All};

在我的函数ProcessFruits中,我将这个enum作为参数传递,但同时我想返回已处理的水果的类型。[它总是只处理一种类型,即使给定一个组合…假设)

因为我只需要返回单一类型,所以我创建了另一个包含ProcessedOutFruitenum

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;
}

问题:有没有更好的方法?

  1. 我们可以有一个enums的子集,这样我就可以表示1st enum as superset of 2nd enum了吗?
  2. 我可以使用输入参数来更新结果并发回[可能是一个糟糕的设计]
  3. 需要更新函数签名吗?请建议一个更好的。

我想达到的目标:

我正在维护两个不同的枚举类,其中包含我想要避免的几乎相似的值。但是当我想到合并这两个枚举类时,它会带走函数签名

的可读性/清晰度。请建议。

谢谢。

能够检测重叠元素的一种方法是,您可以定义这样的枚举:

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检查它是否只是一个单一的水果。

最新更新