Задать вопрос
Dyikot
@Dyikot

Можно ли узнать типы сигнатуры std::function?

Например у меня есть шаблонный класс Event, который принимает THandler, обычно передаю std::function<...> с определнной сигнатурой (например void(Objeсt*, const EventArgs&>) т.е аргументов будет всегда два. Можно ли узнать вот эти типы: Objeсt и EventArgs?
  • Вопрос задан
  • 277 просмотров
Подписаться 2 Простой 17 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Stepik
    Внутреннее устройство контейнеров в STL (C++)
    2 недели
    Далее
  • Skillbox
    Разработчик на C++
    7 месяцев
    Далее
Решения вопроса 1
@enree
C++ engineer
Универсальный вариант разобрать функтор на составляющие

#include <functional>
#include <string>

template <typename F>
struct HandlerTraits;

template <typename R, typename ...Args>
struct HandlerTraits<std::function<R(Args...)>>
{
    using ReturnType = R;
    using ArgTypes = std::tuple<Args...>;
    static constexpr std::size_t ArgCount = sizeof...(Args);
    template <std::size_t N>
    using NthArg = std::tuple_element_t<N, ArgTypes>;
};


template <typename T>
void processEvent(T const& handler)
{   
    using Traits = HandlerTraits<T>;

    static_assert(std::is_same_v<typename Traits::ReturnType, void>);
    static_assert(Traits::ArgCount == 2);
    static_assert(std::is_same_v<typename Traits::template NthArg<0>, std::string*>);
    static_assert(std::is_same_v<typename Traits::template NthArg<1>, int const&>);
}

int main()
{
    processEvent(std::function<void(std::string*, int const&)>{});
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Обычно ты должен УЖЕ знать сигнатуру функции, чтобы принять ссылку на неё. Иначе как ты её вызовешь?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы