Всем привет!
Есть задачка "со звёздочкой". Мне пока не удалось её раскусить, возможно, кому-то из форумчан это удастся.
Итак, есть семейство нешаблонных классов с единственным функциональным оператором (в типовом варианте — это всё классы лямбд). Функциональные операторы всех этих классов удовлетворяют следующим соглашениям:
Операторы могут быть как шаблонными, так и нешаблонными;
Шаблонные операторы могут содержать вариадик пак в конце;
Шаблонные параметры могут быть обложены констрейнтами.
Порядок параметров оператора таков:
Сначала идут все параметры, независящие от параметров шаблона, если они есть,
Затем идут параметры, зависящие от "фиксированных" параметров шаблона — т.е. от параметров шаблона, не входящих в вариадик пак. Опять же, если таковые параметры есть.
В конце идет вариадик пак, опять же, если он есть.
Требуется:
Вытащить из сигнатуры оператора список типов формальных параметров, независящих от параметров шаблона. Форма — произвольная. Это может быть std::tuple, или любой другой тип, способный заключать в себе список типов. В случае отсутсвия таких параметров в операторе, список должен быть пустым.
Определить число параметров, зависящих от "фиксированных" параметров шаблона (т.е. не входящих в вариадик пак).
Определить наличие вариадик пака.
Например, для класса лямбды с такой сигнатурой:
[](int, std::vector<int>&&, const std::string&, std::ranges::range auto&&, auto, const auto&, auto&&...){/* . . . */}
результат должен быть таким: список типов: (int, std::vector<int>&&, const std::string&), число "фиксированных" шаблонных параметров: 3, использование вариадик пака: true.
P.S. Решение по частям тоже будет полезно.