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

Returning enums by value or reference in C++ and possibility of subset of enums

考虑以下场景:

我需要加工水果,大多数时候我都是组合水果[但并非总是如此,让我们假设]所以我创建了 enum,如下所示:

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

在我的函数 ProcessFruits 中,我将此 enum 作为参数传递,但同时我想 return 已处理水果的类型。 [即使给出组合,它也总是只处理一种类型..可以说]

因为我只需要 return 单一类型,所以我创建了另一个包含 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;
}

问题:有更好的方法吗?

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

我想要达到的目标:

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

的readability/clarity

请推荐。

谢谢。

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

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.

查看是不是单个水果