Небольшая выжимка "из недавнего":
template< typename DEMAND_QUEUE > struct common_data_t {...}; class no_activity_tracking_impl_t : protected common_data_t< demand_queue_no_activity_tracking_t > {...}; class activity_tracking_impl_t : protected common_data_t< demand_queue_with_activity_tracking_t > {...}; template< typename IMPL > class work_thread_template_t : public IMPL {...} using work_thread_no_activity_tracking_t = work_thread_template_t< no_activity_tracking_impl_t >; using work_thread_with_activity_tracking_t = work_thread_template_t< activity_tracking_impl_t >; |
Тут и шаблоны, и наследование реализации, и даже CRTP... Боюсь, если придется объяснить что к чему, то в двух словах это и не получится :)
Все эти навороты потребовались, чтобы переделать старый код, который был написан лишь для одного конкретного сценария работы. Потребовалось сделать так, чтобы в одной ситуации он работал одним образом, а в другой -- другим. При этом для второй ситуации нужно было внутрь класса добавить и дополнительных атрибутов, и дополнительных методов. Но изрядная часть функциональности work_thread для обоих ситуаций должна была оставаться одинаковой. Благодаря продвинутым возможностям C++ этого удалось достичь без копипасты.