在现代C ++中,有什么好的方法来获取arg类型列表形式函数指针?

Wan*_*ang 1 c++ function-pointers variadic-templates template-argument-deduction c++17

说我有函数指针R(*fp)(...A)。有什么方法可以获取类型R和类型列表A...吗?std::invoke_result_t似乎不起作用。而且我找不到参数列表的任何内容。

#include <iostream>
#include <cstdlib>
#include <type_traits>
typedef int(*fp_t)(int, float);
std::invoke_result_t<fp_t> x = 10;
int main()
{
    std::cout << "Hello, Wandbox!" << std::endl;
    std::cout << x << std::endl;
}

Run Code Online (Sandbox Code Playgroud)

用c ++ 17编译会出现错误:

/opt/wandbox/gcc-head/include/c++/10.0.0/type_traits: In substitution of 'template<class _Fn, class ... _Args> using invoke_result_t = typename std::invoke_result::type [with _Fn = int (*)(int, float); _Args = {}]':
prog.cc:6:26:   required from here
/opt/wandbox/gcc-head/include/c++/10.0.0/type_traits:2917:11: error: no type named 'type' in 'struct std::invoke_result<int (*)(int, float)>'
 2917 |     using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
Run Code Online (Sandbox Code Playgroud)

Ayj*_*jay 5

用模板元函数推导它们:

#include <tuple>
typedef int(*fp_t)(int, float);

template <class T>
struct function_signature{};

template <class Return, class... Args>
struct function_signature<Return(*)(Args...)> {
    using return_type = Return;
    using args = std::tuple<Args...>;
};

int main()
{
    using ret = function_signature<fp_t>::return_type;
    using args = function_signature<fp_t>::args;
}
Run Code Online (Sandbox Code Playgroud)