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

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

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

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

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

int foo(char, short);

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

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

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

7

Решение

Для не перегруженных функций, указателей на функции и указателей на функции-члены, просто выполните 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> синтаксис.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector