В тяжелых циклах, например, в игровых приложениях, может быть много факторов, которые определяют, какая часть тела цикла выполняется (например, объект-символ будет обновляться по-разному в зависимости от его текущего состояния), и вместо этого:
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) { }
Теперь я действительно задаюсь вопросом: неужели я обманываю это? Например, приведенный выше пример прост; иногда мне нужно проверить многие переменные, чтобы выяснить, какие фрагменты кода мне нужно выполнить, и поэтому я понял, что использование этих указателей функций "состояния" действительно было бы более оптимальным, и для меня это естественно, но несколько человек я Я имею дело с сильно несогласными.
Итак, есть ли выигрыш от использования (виртуального) указателя на функцию, который стоит вместо заполнения моих циклов условными операторами для прохождения логики?
Изменить: чтобы уточнить, как устанавливается указатель, он выполняется через обработку событий для каждого объекта. Когда происходит событие и, скажем, этот символ имеет пользовательскую логику, прикрепленную к нему, он устанавливает указатель обновления в этом обработчике события до тех пор, пока не произойдет другое событие, которое снова изменит поток.
Спасибо