在运行时说我用事件发生时间建立一些事件。现在我在系统中有一些实体,我需要确定哪些实体受到这些事件的影响。
举个例子说我有:
这应该导致:
我想要一个case
- 类似的控制结构来做这个,它支持通过,并且谁的情况被评估为“大于或等于这个值”。我喜欢这样的语法:
for(auto& i : Entity) {
?switch(i.GetInitializedTime()) {
?case(Red.GetOccuranceTime()):
i.AddRed();
?case(Blue.GetOccranceTime()):
i.AddBlue();
?case(Yellow.GetOccuranceTime()):
i.AddYellow();
}
}
是否存在这样的控制结构,还是我必须处理所有if语句?
答案 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
时,最低有效位是否为蓝色的布尔值,中间位为黄色,最高有效位为红色。