Есть ли основанная на диапазоне структура управления

Скажем, во время выполнения я устанавливаю некоторые События со временем возникновения. Теперь у меня есть определенные юридические лица в системе, и мне нужно установить, какие юридические лица были затронуты этими События.

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

  • 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?

0

Решение

Там нет ничего, что даже отдаленно, как то, что вам нужно. Вам придется написать свой собственный класс для этого. На практике это выглядит как отсортированный вектор <time, function> пар.

Даже GCC «расширение диапазона» оператора switch принимает фиксированные диапазоны.

1

Другие решения

Когда событие времена не известны во время проектирования, даже регистр операторов gcc на основе диапазона являются нежизнеспособные решения. Таким образом, лучшим решением будет содержать События в map.

Потому что в оригинальном вопросе событие было только число, вызвавшее вызов конкретного метода на entityэтот процесс может быть упрощен путем событие объект; имея 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, так как он:

Возвращает итератор, указывающий на первый элемент, который больше ключа

Это живой пример использует описанную выше функциональность, но для демонстрации того, что она использует побитовую индексацию массива. При индексации entity::colorArray младший значащий бит — логическое значение для того, был ли добавлен синий, средний бит — желтый, а самый старший бит — красный.

0