gpt4 book ai didi

c++ - 将标志组合映射到枚举的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-28 03:33:40 25 4
gpt4 key购买 nike

我得到了一个看起来或多或少像这样的枚举类型

enum foo{
X,
XandY,
XandZ,
XandYandZ,
none,
Y,
Z,
YandZ,
someSpecialCase,
anotherSpecialCase
};

我有几个通过管道传递的消息对象,一个特定的阶段决定这个消息是否有 X,另一个决定它是否有 Y 等等。最终消息需要用这些标签之一来标记.我设计了消息对象,但已经定义了枚举。我不想假设枚举有任何数值。所以我放置了像 hasX、hasY 这样的 boolean 标志,它们可以在不同的阶段单独设置。有没有比只写几层嵌套的 if-else 子句更好的方法?

为清楚起见进行了编辑
再次编辑,更改变量名称。

最佳答案

如果我对问题的理解是正确的,那么基本上您所说的就是一个多路复用器。即,将多个信息流合并为一个。这可以使用查找表轻松实现,具体实现由您决定。

您可以将各种输入流组合成一个键对象。 我在下面包含了一些代码,但没有时间检查/运行它,所以请将其视为伪代码而不是逐字记录。

使用 map

struct MyKey
{
MyKey( bool X, bool Y, bool Z, bool SC1, bool SC2 ) :
X_(X), Y_(Y), Z_(Z), SC1_(SC1), SC2_(SC2) {}

bool X_;
bool Y_;
bool Z_;
bool SC1_;
bool SC2_;
};

您还需要一个 operator<()函数以便在关联容器中使用它。然后设置一个映射集合,例如 map :

typedef enum foo FooEnum;
std::map< MyKey, FooEnum > myMap;

此 map 需要在您的应用程序启动时设置并加载,类似于以下内容:

myMap.insert( std::make_pair< MyKey, FooEnum >( MyKey(true,false,true,false,false), XandZ ) );

此映射 X 和 Z 仅适用于 XandZ所以每个排列都需要这个。

一旦你来做检查,你需要做的就是:

std::map< MyKey, FooEnum >::const_iterator it = myMap.find( MyKey(X,Y,Z,SC1,SC2) );
if ( it != myMap.end() )
{
enum foo valueINeed = it.second;
// ...

使用 vector/数组

这方面有一些变化。例如,您可以将输入流的值组合为掩码中的位(此处为 5 位),并使用包含 32 个元素的数组或 vector 将每个排列映射到一个单独的元素。

如果这样做,您甚至可以在编译时创建集合。尽管您必须对其进行测试,但它也可能会运行得更快一些。缺点是代码可能有点深奥,但又没有法律禁止文档!

关于c++ - 将标志组合映射到枚举的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com