是否存在基于范围的案例控制结构

时间:2015-10-09 14:11:40

标签: c++ events switch-statement range control-structure

在运行时说我用事件发生时间建立一些事件。现在我在系统中有一些实体,我需要确定哪些实体受到这些事件的影响。

举个例子说我有:

  • 实体1 在时间1初始化
  • EventRed 发生在时间3
  • Entity2 在时间8初始化
  • EventBlue 发生在时间9
  • EventYellow 发生在时间11
  • 实体3 在时间13初始化

这应该导致:

  • 实体1 为白色
  • 实体2 为绿色
  • 实体3 为黑色

我想要一个case - 类似的控制结构来做这个,它支持通过,并且谁的情况被评估为“大于或等于这个值”。我喜欢这样的语法:

for(auto& i : Entity) {
    ?switch(i.GetInitializedTime()) {
    ?case(Red.GetOccuranceTime()):
        i.AddRed();
    ?case(Blue.GetOccranceTime()):
        i.AddBlue();
    ?case(Yellow.GetOccuranceTime()):
        i.AddYellow();
    }
}

是否存在这样的控制结构,还是我必须处理所有if语句?

2 个答案:

答案 0 :(得分:1)

没有什么比你需要的更远。你必须为此编写自己的类。实际上,它看起来像是<time, function>对的有序向量。

即使是switch语句的GCC“范围扩展”也需要固定的范围。

答案 1 :(得分:0)

如果在设计时未知事件次,即使gcc's range based case statements也是not viable solutions。因此,最佳解决方案是在map中包含事件

因为在原始问题中,事件只是导致在entity上调用特定方法的数字,所以可以通过消除事件<来简化此过程/ em>对象;让map使用事件所包含的数字查找它本应调用的entity方法。例如:map<int, function<void(entity&)>> events可以填充:

events[3] = mem_fn(&entity::AddRed);
evnets[9] = mem_fn(&entity::AddBlue);
events[11] = mem_fn(&entity::AddYellow);

填充events后,case语句可以替换为events,从entity i GetInitializedTime()开始:

for(auto j = events.upper_bound(i.GetInitializedTime()); j != events.end(); ++j) {
    j->second(i);
}

upper_bound用于查找起始迭代器,因为它:

  

返回指向第一个元素的迭代器,该元素大于键

This live example使用上面的功能,但为了展示它使用按位数组索引。索引entity::colorArray时,最低有效位是否为蓝色的布尔值,中间位为黄色,最高有效位为红色。