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 ...);
}
显然这个例子有些人为的做法。
这意味着,无论何时我通过函数指针/引用去,默认参数将不再工作(他们成为强制性的),对吧?我的意思是像'auto bar2 = bar;' – leemes
正确。默认参数只与即时呼叫站点相关。 –
@SebastianRedl谢谢澄清。我刚刚测试过:[通过模板参数转发时甚至不可能](http://ideone.com/bkXnN9),这有点令人伤心。 – leemes