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

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

Например у меня есть шаблонный класс Event, который принимает THandler, обычно передаю std::function<...> с определнной сигнатурой (например void(Objeсt*, const EventArgs&>) т.е аргументов будет всегда два. Можно ли узнать вот эти типы: Objeсt и EventArgs?
  • Вопрос задан
  • 260 просмотров
Подписаться 2 Простой 17 комментариев
Решения вопроса 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!
Обычно ты должен УЖЕ знать сигнатуру функции, чтобы принять ссылку на неё. Иначе как ты её вызовешь?
Ответ написан
Ваш ответ на вопрос

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

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