获取函数参数类型为元组

Zan*_*Jie 5 c++ templates variadic-templates template-argument-deduction c++17

问题

给定任何函数(或可调用)类型Function,如何将其所有参数类型作为元组类型?

例如,我需要一个trait function_traits<Function>::arguments,其中:

int f();
typename function_traits<decltype(f)>::arguments // => gives me std::tuple<>

void g(int);
typename function_traits<decltype(g)>::arguments // => gives me std::tuple<int>

void h(int, int);
typename function_traits<decltype(h)>::arguments // => gives me std::tuple<int, int>
Run Code Online (Sandbox Code Playgroud)

我的想法

第一

我需要获取参数的大小,幸运的是boost已经实现了 function_traits<F>::arity

然后

生成一个std::integer_sequence从1来进行构图,将其映射到参数类型,但是问题出在map integer_sequence,我需要这样的东西:

function_traits<F>::arg_type<N> // -> N-th arg_type
Run Code Online (Sandbox Code Playgroud)

但是boost仅提供以下功能:

function_traits<F>::argN_type
Run Code Online (Sandbox Code Playgroud)

我该如何实施function_traits<F>::arg_type<N>?我最多可以使用c ++标准到c ++ 17

use*_*670 6

像这样的东西:

#include <tuple>

template<typename x_Function> class
function_traits;

// specialization for functions
template<typename x_Result, typename... x_Args> class
function_traits<x_Result (x_Args...)>
{
    public: using arguments = ::std::tuple<x_Args...>;
};
Run Code Online (Sandbox Code Playgroud)

用法示例:

#include <type_traits>

int foo(int);

using foo_arguments = function_traits<decltype(foo)>::arguments;
static_assert(1 == ::std::tuple_size<foo_arguments>::value);
static_assert(::std::is_same_v<int, ::std::tuple_element<0, foo_arguments>::type>);
Run Code Online (Sandbox Code Playgroud)

在线编译器