0

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

举个例子说我有:

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

这应该导致:

  • Entity1为白色
  • Entity2为绿色
  • Entity3为黑色

我想要一个类似case的控制结构来做到这一点,它支持失败并且谁的案例被评估为“大于或等于这个值”。我想要这样的语法:

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

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

4

2 回答 2

1

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

甚至 switch 语句的 GCC“范围扩展”也采用固定范围。

于 2015-10-09T14:22:24.577 回答
0

如果在设计时不知道事件时间,即使gcc 的基于范围的 case 语句也不是可行的解决方案。因此,最好的解决方案是将事件包含在map.

因为在最初的问题中,事件只是一个数字,导致在 上调用特定方法,因此可以通过取消事件对象entity来简化此过程;使用事件将包含的数字查找它将调用的方法。例如:可以填充为:mapentitymap<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语句可以替换为从'sevents开始的迭代:entity iGetInitializedTime()

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

upper_bound用于查找开始迭代器 this 因为它:

返回指向第一个大于 key 的元素的迭代器

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

于 2015-10-12T12:09:26.337 回答