Я недавно узнал, что я не могу:
Но я также недавно узнал, что я Можно вызов decltype
чтобы получить тип возврата указанной функции
Итак, неопределенная функция:
int foo(char, short);
Я хотел бы знать, есть ли способ, которым я могу сопоставить типы параметров с типами в tuple
, Это, очевидно, вопрос метапрограммирования. То, для чего я действительно стреляю, является чем-то вроде decltypeargs
в этом примере:
enable_if_t<is_same_v<tuple<char, short>, decltypeargs<foo>>, int> bar;
Может кто-нибудь помочь мне понять, как decltypeargs
может быть обработан?
Для не перегруженных функций, указателей на функции и указателей на функции-члены, просто выполните 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>
синтаксис.
Других решений пока нет …