在 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;
}
问题:有更好的方法吗?
- 我们可以得到
enums
的子集以便我可以表示 1st enum as superset of 2nd enum
吗?
- 我可以使用输入参数来更新结果并发回吗[可能是一个糟糕的设计]
- 需要更新函数签名?请推荐一个更好的。
我想要达到的目标:
我正在维护 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
.
查看是不是单个水果
考虑以下场景:
我需要加工水果,大多数时候我都是组合水果[但并非总是如此,让我们假设]所以我创建了 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;
}
问题:有更好的方法吗?
- 我们可以得到
enums
的子集以便我可以表示1st enum as superset of 2nd enum
吗? - 我可以使用输入参数来更新结果并发回吗[可能是一个糟糕的设计]
- 需要更新函数签名?请推荐一个更好的。
我想要达到的目标:
我正在维护 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
.