2015-10-09 4 views
0

Говорите во время выполнения. Я устанавливаю некоторые события со временем возникновения. Теперь у меня есть определенные объектов в системе, и мне нужно установить, какие предприятиями были затронуты этими событиями.Есть ли структура, основанная на диапазоне, как структура управления

Так как пример сказать, что у меня есть:

  • entity1 intialized во время 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(); 
    } 
} 

Есть ли структура управления, как это, или я должен жонглировать все если заявление?

+1

Я был довольно озадачен, когда впервые увидел этот синтаксис: 'case 0x20 ... 0xFF:', но я не уверен, что его расширение GCC. –

+0

Для того, что вам нужно в вашем примере, это невозможно, поскольку метки метки метки метки должны быть известны во время компиляции. –

+1

@ πάνταῥεῖ: Это расширение: https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html –

ответ

0

Когда событие раз не известны во время разработки, даже gcc's range based case statements являются not 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, начиная с entity i «s GetInitializedTime():

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> пар.

Даже расширение диапазона расширения GCC оператора switch фиксирует диапазоны.

Смежные вопросы