默认参数的函数特征
Function traits for default parameters
问题中Is it possible to figure out the parameter type and return type of a lambda?
a nice implementation of a function_traits
struct is shown / linked.
这个特征结构允许确定
- return 输入
- 函数调用类型(即
R(Ts ...)
)
- 函数数量
- 每个参数的参数类型
但是它无法使用默认参数正常工作。也就是说,只有完整的类型(包括所有默认参数)才被认为是函数的类型。
Is it possible to write a function_trait
which enables to check whether a given function parameter is a default parameter?
具体来说,我想稍后使用这个特性使用 SFINAE 根据传递给函数的函数的最小/最大数量以及传递给函数的参数包的大小来启用/禁用给定的实现.
template <typename Func, typename ... Ts>
std::enable_if<(function_trait<decltype(F)>::min_arity >= sizeof ... ( Ts )
and
function_trait<decltype(F)>::max_arity <= sizeof ... ( Ts ) )>::type
foo( Func F, Ts ... ts ){
F( ts ... );
}
显然这个例子有些做作。
您不能只使用可用的函数类型来做到这一点,因为默认参数 不是 函数类型的一部分。以下holds:
void foo(int, int);
void bar(int, int = 42);
static_assert(std::is_same<decltype(foo), decltype(bar)>::value, "He's wrong!");
这意味着你不能说 Func
类型的函数是否可以使用小于其参数数量的特定数量的参数来调用。
问题中Is it possible to figure out the parameter type and return type of a lambda?
a nice implementation of a function_traits
struct is shown / linked.
这个特征结构允许确定
- return 输入
- 函数调用类型(即
R(Ts ...)
) - 函数数量
- 每个参数的参数类型
但是它无法使用默认参数正常工作。也就是说,只有完整的类型(包括所有默认参数)才被认为是函数的类型。
Is it possible to write a
function_trait
which enables to check whether a given function parameter is a default parameter?
具体来说,我想稍后使用这个特性使用 SFINAE 根据传递给函数的函数的最小/最大数量以及传递给函数的参数包的大小来启用/禁用给定的实现.
template <typename Func, typename ... Ts>
std::enable_if<(function_trait<decltype(F)>::min_arity >= sizeof ... ( Ts )
and
function_trait<decltype(F)>::max_arity <= sizeof ... ( Ts ) )>::type
foo( Func F, Ts ... ts ){
F( ts ... );
}
显然这个例子有些做作。
您不能只使用可用的函数类型来做到这一点,因为默认参数 不是 函数类型的一部分。以下holds:
void foo(int, int);
void bar(int, int = 42);
static_assert(std::is_same<decltype(foo), decltype(bar)>::value, "He's wrong!");
这意味着你不能说 Func
类型的函数是否可以使用小于其参数数量的特定数量的参数来调用。