@setpoint_f, я пришёл из флудилки, чтобы сказать, что так делать не стоит. CRTP стоит избегать до тех пор, пока существуют решения лучше. И пока что подходящее решение есть —
класс трейтов, определяющий поведение базы. Плюсы этого подхода по сравнению с CRTP:
1) код понятнее — нет рекурсии;
2) код понятнее — подход, используемый как в стандартной, так и во многих modern c++ библиотеках;
3) код выдаёт меньше сложночитаемых и сложнопонимаемых ошибок компиляции в связи с тем, что в отличии от классического наследования, CRTP не позволяет явно выразить интерфейс — увы, компиляция чаще будет ломаться в недрах шаблонных функций, что не способствует пониманию или расширению кода;
4) потребовать определённого интерфейса от трейтов проще, чем от наследника в базовом классе в случае CRTP
Сам код, который я дал выше переписан 1 в 1 на трейты, я постарался не менять логики происходящего и даже не вникал в суть кода, поскольку я не нашёл начала диалога и исходной задачи, но обязан был сказать, что так лучше не делать без крайней необходимости