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