Есть возможное удобное применение — callback'и. Они используются достаточно широко и часто нужно иметь возможность их конфигурировать — я видел два варианта:
1. передавать вместе с callback'ом нужные данные, а потом во время вызова callback'а передавать их ему;
2. писать класс с полями, с помощью инициализации которых и будет конфигурироваться callback.
Данный же подход позволяет использовать лишь функцию. А при передачи ей нужных аргументов происходит то самое конфигурирование callback'а.
На самом деле, все, что используется здесь, — это развертывание шаблонных типов или аргументов (pack expansion). А выглядит оно страшно только потому, что используется нетривиальным (но очевидным) способом, т.е. не просто
Templ<T...>
но и
Templ1<Templ2<T>...>
или
g(f<v>...)
а может также потому, что это фича с нового стандарта и еще мало кем используется. А все остальное — это обыкновенное ООП: несколько классов с обычными методами и конструкторами — даже наследования нету.
Данный же подход позволяет обойтись определением только одной функции:
Данный же подход позволяет использовать лишь функцию. А при передачи ей нужных аргументов происходит то самое конфигурирование callback'а.