如何根据一对枚举的值选择操作? 我在C++缓存一致性协议中实现协议的模型是特别的,但对于这个问题并不重要。

如何根据一对枚举的值选择操作? 我在C++缓存一致性协议中实现协议的模型是特别的,但对于这个问题并不重要。,c++,software-design,C++,Software Design,该协议采用两个值:前一个_状态和消息类型。两者都是枚举。协议应为两个输入的每个组合选择唯一的操作。某些组合无效,应显示错误,并暂停少数组合 在C++中,对上面的场景进行编码是一个好方法?我可以想到:两个嵌套的开关块来选择输入组合,并调用作为函数实现的特定操作 是否有更优雅、更灵活的方法来编写上述场景?理想情况下,从协议中添加/删除输入组合应该很容易 谢谢你的建议。我是设计模式的新手,不知道任何适合这里的模式让我们假设这两个枚举是32位的值。我会这样做: void doit(E1 previous

该协议采用两个值:前一个_状态和消息类型。两者都是枚举。协议应为两个输入的每个组合选择唯一的操作。某些组合无效,应显示错误,并暂停少数组合

<>在C++中,对上面的场景进行编码是一个好方法?我可以想到:两个嵌套的开关块来选择输入组合,并调用作为函数实现的特定操作

是否有更优雅、更灵活的方法来编写上述场景?理想情况下,从协议中添加/删除输入组合应该很容易


谢谢你的建议。我是设计模式的新手,不知道任何适合这里的模式

让我们假设这两个枚举是32位的值。我会这样做:

void doit(E1 previous_state, E2 message_type) {
# define COMBINE(_x_, _y_) (static_cast<int64_t>(previous_state) << 32 | message_type)
  switch (COMBINE(previous_state, message_type) {
  case COMBINE(e1value1, e2value1):
    // ...
    break;
  case COMBINE(e1value4, e2value3):
    // ...
    break;
  // ... more cases ...
  default:
    // report error
  }
}

尽管switch语句经常被优化到跳转表中,但不要认为这会生成更快的代码,但像这样的技巧可能会破坏这一点。如果您最感兴趣的是尽可能最好的性能,那么您必须试验并找出系统上最好的性能。注意,在我的示例中,将int64\t更改为较小的类型并最小化移位可能会产生一些效果。

为什么不使用简单的二维数组?比如说

enum Previous_state
{
state_1 = 0,
state_2,
...,
state_n,
PreviousLastValue
}

enum Message_type
{
type_1 = 0,
type_2,
...,
type_n,
TypeLastValue
}
...

Action actions[PreviousLastValue][TypeLastValue] = {NULL}; 

void SetAction(Previous_state state, Message_type type, Action action)
{
    actions[state][type] = action;
}

void RemoveAction(Previous_state state, Message_type type)
{
    actions[state][type] = 0;
}

void GetAction(Previous_state state, Message_type type)
{
    if(actions[state][type] == 0)
    {
        //display error
    }

    return actions[state][type];
}

不确定,但可能是信号槽?如果操作函数的签名相同,可能使用std::map。@hmjd:如果您不太关心性能的话。这是尖叫多态性。如果你想用多态性建模,你还应该看看访问者模式,也就是双重分派。另外,如果您有一个状态,并且消息将其传输到另一个状态,那么您就有一个状态机,其中有一些库可以为它们建模。谢谢您的回答。我可以确定这两个枚举是32位的吗?否则,左换档将不起作用。我刚刚这样声明了它们:enum StateType{A,B,…}enum MessageType{M1,M2…}如果你有一个C++11编译器,你可以做:enum:long{A,B,C};这将帮助您明确确定存储的大小。assertsizeofStateType==4或静态断言(如果您使用的是C++11),或BOOST\u静态断言。正如@PeterR所说,对于使用C++11锁定特定大小,您应该说enum:int32\t。。。等