- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了一个看起来或多或少像这样的枚举类型
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/
我是一名优秀的程序员,十分优秀!