Есть задачка "со звёздочкой". Мне пока не удалось её раскусить, возможно, кому-то из форумчан это удастся.
Итак, есть семейство нешаблонных классов с единственным функциональным оператором (в типовом варианте — это всё классы лямбд). Функциональные операторы всех этих классов удовлетворяют следующим соглашениям:
Операторы могут быть как шаблонными, так и нешаблонными;
Шаблонные операторы могут содержать вариадик пак в конце;
Шаблонные параметры могут быть обложены констрейнтами.
Порядок параметров оператора таков: Сначала идут все параметры, независящие от параметров шаблона, если они есть,
Затем идут параметры, зависящие от "фиксированных" параметров шаблона — т.е. от параметров шаблона, не входящих в вариадик пак. Опять же, если таковые параметры есть.
В конце идет вариадик пак, опять же, если он есть.
Требуется:
Вытащить из сигнатуры оператора список типов формальных параметров, независящих от параметров шаблона. Форма — произвольная. Это может быть std::tuple, или любой другой тип, способный заключать в себе список типов. В случае отсутсвия таких параметров в операторе, список должен быть пустым.
Определить число параметров, зависящих от "фиксированных" параметров шаблона (т.е. не входящих в вариадик пак).
Определить наличие вариадик пака.
результат должен быть таким: список типов: (int, std::vector<int>&&, const std::string&), число "фиксированных" шаблонных параметров: 3, использование вариадик пака: true.
P.S. Решение по частям тоже будет полезно.
--
Справедливость выше закона. А человечность выше справедливости.
#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
}
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Великий Реверс, Вы писали:
ВР>рефлексия еще не заехала ВР>можно вытянуть все как то так ВР>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&& ...)>]
Мне же нужны сущности времени компиляции, которые я смогу использовать для параметризации и инстанцирования шаблонов. А начто мне этот текст?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Великий Реверс, Вы писали:
ВР>рефлексия еще не заехала
Мне моя чуйка подсказывает, что должно быть "чистое" решение в компайл тайме. Если отбросить шаблонные параметры, то список типов формальных параметров вытаскивается с пол пинка. Вот, теперь нужно то же самое, только в присутствии шаблонных параметров.
--
Справедливость выше закона. А человечность выше справедливости.
R>Мне же нужны сущности времени компиляции, которые я смогу использовать для параметризации и инстанцирования шаблонов. А начто мне этот текст?
ну юзают же вон челы во всяких своих либах
и таких либ пруд пруди
тот же enum magic или как там его
например распарсив дальше в компайл там этот тип лямбды и его параметры
можно эти параметры узнавать по номеру позиции
и уже этот номер позиции вытягивать с тапла и склеивать новый тапл
вообще у меня какое то дежавю
а именно эту задачу где то уже видел
не помню где
или здесь на форуме
или в какой то либе
возможно как задача на какой то собес
Здравствуйте, Великий Мессия, Вы писали:
ВМ>вообще у меня какое то дежавю ВМ>а именно эту задачу где то уже видел ВМ>не помню где ВМ>или здесь на форуме ВМ>или в какой то либе ВМ>возможно как задача на какой то собес
Здравствуйте, Великий Мессия, Вы писали:
ВМ>нет, там была задача именно разобрать и вытянуть и разделить какие типы ВМ>вообщем то на 99% похожа на эту
Гм... Ты меня прямо заинтриговал. Неужели где-то во вселенной существуют мои братья по разуму.
Так-то я не первый год уже ношу в голове эту задачу (года эдак с 2015-го), просто не выкладывал. Уменя было даже два костыльных решения. Одно было основано на багах msvc и пошло лесом с приходом msvc-14.2. А второе решение — "грязное" — основано на использовании дополнительных данных и дополнительных ограничениях.
--
Справедливость выше закона. А человечность выше справедливости.