Определение типов параметров неопределенной функции

недавно я узнал, что не могу:

  1. возьмите адрес неопределенной функции
  2. возьмите адрес шаблонной функции с типом, который она не сможет скомпилировать для

но я также недавно узнал, что я can вызов decltype чтобы получить возвращаемый тип указанной функции

таким образом, неопределенная функция:

int foo(char, short);

Я хотел бы знайте, есть ли способ, которым я могу сопоставить типы параметров с типами в tuple. Это, очевидно, вопрос метапрограммирования. То, что я действительно стреляю, - это что-то вроде decltypeargs в этом примере:

enable_if_t<is_same_v<tuple<char, short>, decltypeargs<foo>>, int> bar;

может кто-нибудь помочь мне понять, как decltypeargs можно сделать?

1 ответов


для ненагруженных функций, указателей на функции и указателей на функции-члены, просто делая decltype(function) дает вам тип функции в необработанные контексте, и этот тип содержит все аргументы.

Итак, чтобы получить типы аргументов как кортеж, все, что вам нужно, это много специализаций:

// primary for function objects
template <class T>
struct function_args
: function_args<decltype(&T::operator()>
{ };

// normal function
template <class R, class... Args>
struct function_args<R(Args...)> {
    using type = std::tuple<Args...>;
};

// pointer to non-cv-qualified, non-ref-qualified, non-variadic member function
template <class R, class C, class... Args>
struct function_args<R (C::*)(Args...)>
: function_args<R(Args...)>
{ };

// + a few dozen more in C++14
// + a few dozen more on top of that with noexcept being part of the type system in C++17

С:

template <class T>
using decltypeargs = typename function_args<T>::type;

это требует от вас написать decltypeargs<decltype(foo)>.


С C++17 у нас будет template <auto>, так выше может быть:

template <auto F>
using decltypeargs = typename function_args<decltype(F)>::type;

и ты decltypeargs<foo> синтаксис.