суббота, 13 августа 2016 г.

[prog.c++] И еще раз шаблоны, шаблоны, кругом одни шаблоны :)

Небольшая выжимка "из недавнего":

templatetypename 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 > {...};

templatetypename 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++ этого удалось достичь без копипасты.