在这个问题中Is it possible to figure out the parameter type and return type of a lambda?
,function_traits
显示/链接了一个不错的struct实现。
这种特征结构可以确定
R(Ts ...)
)但是,它不能与默认参数一起正常工作。也就是说,只有完整类型(包括所有默认参数)才被视为函数的类型。
是否可以编写a
function_trait
来检查给定的功能参数是否为默认参数?
具体来说,我想在以后使用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 ... );
}
显然,这个例子有些人为的。
您不能仅使用可用的函数类型来执行此操作,因为默认参数不是函数类型的一部分。以下内容成立:
void foo(int, int);
void bar(int, int = 42);
static_assert(std::is_same<decltype(foo), decltype(bar)>::value, "He's wrong!");
这意味着您无法确定是否Func
可以使用少于其数量的一定数量的参数来调用类型的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句