默认参数的功能特征

时间:2015-01-16 12:48:20

标签: c++ templates c++11 template-meta-programming typetraits

在问题Is it possible to figure out the parameter type and return type of a lambda?中,显示了function_traits结构的一个很好的实现/ linked

此特征结构允许确定

  • 返回类型
  • 函数调用类型(即R(Ts ...)
  • function arity
  • 每个参数的参数类型

然而,它无法使用默认参数正常工作。也就是说,只有完整类型(包括所有默认参数)才被认为是函数的类型。

  

是否可以编写function_trait来检查给定的函数参数是否为默认参数?


具体来说,我想稍后使用SFINAE来根据传递给函数的函数的最小/最大arity以及传递给函数的参数包的大小来启用/禁用给定的实现。 / p>

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 ... );
}

显然这个例子有点人为。

1 个答案:

答案 0 :(得分:3)

仅使用可用的函数类型不能这样做,因为默认参数不是函数类型的一部分。以下holds

void foo(int, int);
void bar(int, int = 42);

static_assert(std::is_same<decltype(foo), decltype(bar)>::value, "He's wrong!");

这意味着您无法说明类型Func的函数是否可以使用少于其参数数量的一定数量的参数进行调用。