2015-10-09 59 views
0

說在運行時我建立了一些事件與發生次數。現在我在系統中有一些實體,我需要確定哪些實體受到這些事件的影響。是否有基於範圍的類似案例控制結構

因此,作爲一個例子說,我有:

  • ENTITY1在時間1
  • EventRed發生在時間3
  • ENTITY2在時間初始化intialized 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語句?

+1

當我第一次看到這個語法時,我非常困惑:'case 0x20 ... 0xFF:',但我不確定它是否是GCC特定的擴展。 –

+0

對於你在示例中需要的內容,這是不可能的,因爲在編譯時需要知道case標記跳轉標記。 –

+1

@πάνταῥεῖ:它是一個擴展名:https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html –

回答

0

當在設計時不知道事件時,即使gcc's range based case statementsnot viable solutions。因此,最佳解決方案是將事件包含在map中。

因爲在原來的問題的事件只是導致在entity被調用的具體方法的數,這個過程可以通過將eleminating事件對象被簡化;使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迭代來代替,開始在的GetInitializedTime()entity i

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

upper_bound使用找到這個起始迭代器,因爲它:

點返回指向即大於鍵

This live example使用的功能如上所述,但爲了展示,它使用按位數組索引的第一個元素的迭代器。索引entity::colorArray時,最不重要的位是否是添加了藍色的布爾值,中間位是黃色,最高位是紅色。

1

沒有什麼東西甚至遠遠地像你需要的東西。你必須爲此編寫自己的課程。實際上,它看起來像是<time, function>對的排序向量。

即使switch語句的GCC「範圍擴展」也需要固定的範圍。

相關問題