В тяжелых циклах, таких как в игровых приложениях, может быть много факторов, которые определяют, какая часть тела цикла будет выполняться (например, объект персонажа будет обновляться по-разному в зависимости от его текущего состояния), и поэтому вместо этогоделания:
void my_loop_function(int dt) {
if (conditionX && conditionY)
doFoo();
else
doBar();
...
}
Я привык использовать указатель на функцию, которая указывает на определенную логическую функцию, соответствующую текущему состоянию персонажа , например:
void (*updater)(int);
void something_happens() {
updater = &doFoo;
}
void something_else_happens() {
updater = &doBar;
}
void my_loop_function(int dt) {
(*updater)(dt);
...
}
И в случае, когда я не хочу ничего делать, я определяю фиктивную функцию и указываю на нее, когда мне нужно:
void do_nothing(int dt) { }
Теперь я действительно задаюсь вопросом:зацикливаться на этом без нужды?Приведенный выше пример, конечно, прост;иногда мне нужно проверять множество переменных, чтобы выяснить, какие части кода мне нужно выполнить, и поэтому я решил, что использование этих указателей на функцию «состояние» действительно будет более оптимальным, и, на мой взгляд, естественным, но несколько человек, которых яЯ имею дело с очень не согласен.
Так стоит ли использовать виртуальный указатель на функцию вместо того, чтобы заполнять мои циклы с помощью условных операторов для прохождения логики?
Редактировать : чтобы уточнить, как устанавливается указатель, это делается с помощью обработки событий для каждого объекта.Когда происходит событие и, скажем, к этому персонажу прикреплена пользовательская логика, он устанавливает указатель обновления в этом обработчике событий до тех пор, пока не произойдет другое событие, которое снова изменит поток.
Спасибо