0

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

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

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

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

4

1 回答 1

2

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

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

使用地图

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<()函数才能在关联容器中使用它。然后您设置一个映射集合,例如地图:

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

此地图需要在您的应用程序启动并加载时进行设置,如下所示:

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;
    // ...

使用向量/数组

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

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

于 2012-08-03T14:52:15.057 回答