Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 06.02.25 10:58
Оценка:
Всем привет!

Есть задачка "со звёздочкой". Мне пока не удалось её раскусить, возможно, кому-то из форумчан это удастся.

Итак, есть семейство нешаблонных классов с единственным функциональным оператором (в типовом варианте — это всё классы лямбд). Функциональные операторы всех этих классов удовлетворяют следующим соглашениям:


Требуется:

Например, для класса лямбды с такой сигнатурой:

[](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. Решение по частям тоже будет полезно.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.02.2025 12:35 rg45 . Предыдущая версия . Еще …
Отредактировано 06.02.2025 11:28 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:26 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:17 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:16 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:15 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:13 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 11:11 rg45 . Предыдущая версия .
Отредактировано 06.02.2025 10:59 rg45 . Предыдущая версия .
Re: Анализ списка параметров лямбды
От: kov_serg Россия  
Дата: 06.02.25 22:09
Оценка: 10 (1)
Здравствуйте, rg45, Вы писали:

R>Есть задачка


Это смотрели https://github.com/HexadigmSystems/FunctionTraits ?
Re[2]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 06.02.25 22:23
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Это смотрели https://github.com/HexadigmSystems/FunctionTraits ?


Не смотрел, но посмотрю. Описание заинтересовывает.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 06.02.25 23:17
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Это смотрели https://github.com/HexadigmSystems/FunctionTraits ?


Может, я чего-то не понял. Но, судя по тому, что я вижу, эта штука в шаблоны не умеет:

https://godbolt.org/z/KG8xo747E

#include "CompilerVersions.h"
#include "TypeTraits.h"

#include <iostream>

int main()
{
    auto f = [](int, double, const char*){};
    using F = decltype(f);
    StdExt::DisplayAllFunctionTraits<F>(std::cout);

#if 0
    auto g = [](int, double, const char*, auto&&){};
    using G = decltype(g);
    StdExt::DisplayAllFunctionTraits<G>(std::cout); // error: no matching function for call to
#endif
}


--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.02.2025 23:20 rg45 . Предыдущая версия .
Re: Анализ списка параметров лямбды
От: Великий Реверс google
Дата: 06.02.25 23:50
Оценка: :)
рефлексия еще не заехала
можно вытянуть все как то так
https://functionalcpp.wordpress.com/2013/08/05/function-traits/
можно наверное концептами обложить и выкрутиться в каких то случаях
получив допустим на хвосте и вариадики
как авто вылавливать хз

ну или по старинке
как делают сейчас многие либы и та выше что посоветовали

#include <iostream>
#include <vector>

template<typename T>
static constexpr auto get_type()
{
    return std::string(__PRETTY_FUNCTION__);
}

int main()
{
    auto f = [](int, std::vector<int>&&, const std::string&, std::ranges::range auto&&, auto, const auto&, auto&&...){};
    using F = decltype(f);
    std::cout << get_type<F>() << std::endl;
}


constexpr auto get_type() [with T = main()::<lambda(int, std::vector<int>&&, const std::string&, auto:6&&, auto:7, const auto:8&, auto:9&& ...)>]


а дальше работа со строками
бегаем убираем добавляем

но в tuple такое скорее всего не запихать

так что с туплом это по пути варианта номер один
Re[2]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 07.02.25 10:13
Оценка:
Здравствуйте, Великий Реверс, Вы писали:

ВР>рефлексия еще не заехала

ВР>можно вытянуть все как то так
ВР>https://functionalcpp.wordpress.com/2013/08/05/function-traits/
ВР>можно наверное концептами обложить и выкрутиться в каких то случаях
ВР>получив допустим на хвосте и вариадики
ВР>как авто вылавливать хз

ВР>ну или по старинке

ВР>как делают сейчас многие либы и та выше что посоветовали

ВР>
ВР>#include <iostream>
ВР>#include <vector>

ВР>template<typename T>
ВР>static constexpr auto get_type()
ВР>{
ВР>    return std::string(__PRETTY_FUNCTION__);
ВР>}

ВР>int main()
ВР>{
ВР>    auto f = [](int, std::vector<int>&&, const std::string&, std::ranges::range auto&&, auto, const auto&, auto&&...){};
ВР>    using F = decltype(f);
ВР>    std::cout << get_type<F>() << std::endl;
ВР>}
ВР>


ВР>

ВР>constexpr auto get_type() [with T = main()::<lambda(int, std::vector<int>&&, const std::string&, auto:6&&, auto:7, const auto:8&, auto:9&& ...)>]


Мне же нужны сущности времени компиляции, которые я смогу использовать для параметризации и инстанцирования шаблонов. А начто мне этот текст?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 07.02.2025 10:55 rg45 . Предыдущая версия . Еще …
Отредактировано 07.02.2025 10:14 rg45 . Предыдущая версия .
Re[2]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 07.02.25 10:23
Оценка:
Здравствуйте, Великий Реверс, Вы писали:

ВР>рефлексия еще не заехала


Мне моя чуйка подсказывает, что должно быть "чистое" решение в компайл тайме. Если отбросить шаблонные параметры, то список типов формальных параметров вытаскивается с пол пинка. Вот, теперь нужно то же самое, только в присутствии шаблонных параметров.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 07.02.2025 10:23 rg45 . Предыдущая версия .
Re[3]: Анализ списка параметров лямбды
От: Великий Мессия google
Дата: 07.02.25 12:58
Оценка:
R>Мне же нужны сущности времени компиляции, которые я смогу использовать для параметризации и инстанцирования шаблонов. А начто мне этот текст?

ну юзают же вон челы во всяких своих либах
и таких либ пруд пруди
тот же enum magic или как там его

например распарсив дальше в компайл там этот тип лямбды и его параметры
можно эти параметры узнавать по номеру позиции
и уже этот номер позиции вытягивать с тапла и склеивать новый тапл
Re[3]: Анализ списка параметров лямбды
От: Великий Мессия google
Дата: 07.02.25 13:04
Оценка: 10 (1)
знаешь про https://github.com/tip-of-the-week/cpp ?
там раньше много любопытных решений публиковалось

на вскидку можешь глянуть на
https://github.com/tip-of-the-week/cpp/blob/master/tips/255.md
https://github.com/tip-of-the-week/cpp/blob/master/tips/350.md

и еще пошерстить
может какие мысли придут

там есть рефлексия С++26 в примерах на годболт
сделай на ней
а потом вернешься на С++11

если это для собеса, скажешь что ты из будущего

в бусте есть function_traits кажется делает тоже что по ссылке выше я давал на в блоге 2013 года
https://www.boost.org/doc/libs/1_85_0/libs/functional/function_traits.html


вообще у меня какое то дежавю
а именно эту задачу где то уже видел
не помню где
или здесь на форуме
или в какой то либе
возможно как задача на какой то собес
Re: Анализ списка параметров лямбды
От: Великий Мессия google
Дата: 07.02.25 13:06
Оценка:
вот еще чел сделал рефлексию С++26 но для С++20 как я понимаю
https://github.com/qlibs/mp
может там чего удастся вытянуть
Re[4]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 07.02.25 13:27
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>вообще у меня какое то дежавю

ВМ>а именно эту задачу где то уже видел
ВМ>не помню где
ВМ>или здесь на форуме
ВМ>или в какой то либе
ВМ>возможно как задача на какой то собес

Ты не это
Автор: rg45
Дата: 11.03.18
случайно имеешь в виду?
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Анализ списка параметров лямбды
От: Великий Мессия google
Дата: 07.02.25 13:42
Оценка:
нет, там была задача именно разобрать и вытянуть и разделить какие типы
вообщем то на 99% похожа на эту

но не помню с функции или лямбды
и 2018 это слишком далеко
в пределах последний 4-5 лет это встречалось
Re[6]: Анализ списка параметров лямбды
От: rg45 СССР  
Дата: 07.02.25 13:53
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>нет, там была задача именно разобрать и вытянуть и разделить какие типы

ВМ>вообщем то на 99% похожа на эту

Гм... Ты меня прямо заинтриговал. Неужели где-то во вселенной существуют мои братья по разуму.

Так-то я не первый год уже ношу в голове эту задачу (года эдак с 2015-го), просто не выкладывал. Уменя было даже два костыльных решения. Одно было основано на багах msvc и пошло лесом с приходом msvc-14.2. А второе решение — "грязное" — основано на использовании дополнительных данных и дополнительных ограничениях.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 07.02.2025 14:13 rg45 . Предыдущая версия . Еще …
Отредактировано 07.02.2025 14:10 rg45 . Предыдущая версия .
Отредактировано 07.02.2025 14:04 rg45 . Предыдущая версия .
Отредактировано 07.02.2025 13:59 rg45 . Предыдущая версия .
Отредактировано 07.02.2025 13:58 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.