На мгновение принимая ваше виртуальное диспетчерское решение, ваш шаблонный подход гарантирует единообразие имени и аргументов функции обратного вызова.К сожалению, это заставит много другого кода устранять неоднозначность, какой обратный вызов вызывается / переопределяется, что, вероятно, вызывает больше проблем, чем пользы.
Тем не менее, как сказал Дженм, существуют другие варианты.Функторы являются более мощными (вы можете изменить их на существующем объекте во время выполнения, вы можете иметь списки наблюдателей), но их также нужно инициализировать в нужное время (чисто виртуальные функции эффективно напоминают программисту о необходимости предоставлять их во время компиляции)и представьте большее разнообразие состояний времени выполнения, чтобы рассуждать и понимать.
Вы также можете использовать шаблонную политику или шаблон любопытного повторяющегося шаблона для предоставления поведения во время компиляции, что позволяет встраивать мертвыеустранение кода, специфичные для типа поведения и другие оптимизации.