Определение типов параметров неопределенной функции
недавно я узнал, что не могу:
- возьмите адрес неопределенной функции
- возьмите адрес шаблонной функции с типом, который она не сможет скомпилировать для
но я также недавно узнал, что я 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>
синтаксис.