Здравствуйте, niXman, Вы писали:
X>расскажите, как бы вы реализовали подобную задачу, и почему именно так?
У засовывания всего в шаблон есть один маленький минус: сложно параметризовать в рантайме.
Например, у модуля сжатия могут быть параметры — степень сжатия, размер словаря и/или окна.
Тащить это всё в шаблон — можно, но каждый раз мы будем получать новый тип.
Первый способ — делать двухэтажную конструкцию
typedef megaclass< helper1, helper2, helper3 > mega123;
mega123 m; // все настройки по умолчанию
mega123 n( helper1(x,y,z), helper2(), helper3(t,u) ); // частные настройки
как это делается, к примеру, у std::map — где можно настраивать компаратор и аллокатор.
Это осмысленно, когда таких объектов много, и они предполагаются долгоживущими — это статические переменные, члены класса и т.д. — и ими можно как-то обмениваться.
Если же объект утилитарный, то больше подходит другой способ: конструирование по месту
auto m = megaclass().use(helper1()).use(helper2()).use(helper3());
auto n = megaclass().use(helper1(x,y,z)).use(helper2()).use(helper3(t,u));