Скажем, во время выполнения я устанавливаю некоторые События со временем возникновения. Теперь у меня есть определенные юридические лица в системе, и мне нужно установить, какие юридические лица были затронуты этими События.
Так что в качестве примера скажу, что у меня есть:
Это должно привести к:
я хочу case
-подобная структура управления для выполнения этого, которая поддерживает провал и чьи дела оцениваются как «больше или равно этому значению». Я хотел бы синтаксис, как это:
for(auto& i : Entity) {
?switch(i.GetInitializedTime()) {
?case(Red.GetOccuranceTime()):
i.AddRed();
?case(Blue.GetOccranceTime()):
i.AddBlue();
?case(Yellow.GetOccuranceTime()):
i.AddYellow();
}
}
Есть ли такая структура управления или я должен манипулировать всеми операторами if?
Там нет ничего, что даже отдаленно, как то, что вам нужно. Вам придется написать свой собственный класс для этого. На практике это выглядит как отсортированный вектор <time, function>
пар.
Даже GCC «расширение диапазона» оператора switch принимает фиксированные диапазоны.
Когда событие времена не известны во время проектирования, даже регистр операторов 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
младший значащий бит — логическое значение для того, был ли добавлен синий, средний бит — желтый, а самый старший бит — красный.