2015-01-16 68 views
2

Is it possible to figure out the parameter type and return type of a lambda?这个问题中,显示了function_traits结构的一个很好的实现/ linked默认参数的功能特征

此性状结构允许确定

  • 返回类型
  • 函数呼叫类型(即R(Ts ...)
  • 功能元数
  • 参数类型为每个参数

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

是否可以编写一个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 ...); 
} 

显然这个例子有些人为的做法。

回答

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类型的函数可以用一定数量的参数小于其数量的参数来调用。

+0

这意味着,无论何时我通过函数指针/引用去,默认参数将不再工作(他们成为强制性的),对吧?我的意思是像'auto bar2 = bar;' – leemes

+1

正确。默认参数只与即时呼叫站点相关。 –

+0

@SebastianRedl谢谢澄清。我刚刚测试过:[通过模板参数转发时甚至不可能](http://ideone.com/bkXnN9),这有点令人伤心。 – leemes