默认参数的函数特征
Function traits for default parameters
在问题Is it possible to figure out the parameter type and return type of a lambda?
显示/链接了function_traits
结构的一个很好的实现。
此特征结构允许确定
- 返回类型
- 函数调用类型(即
R(Ts ...)
) - 功能参数
- 每个参数的参数类型
但是,它无法使用默认参数正常工作。也就是说,只有完整的类型(包括所有默认参数)才被认为是函数的类型。
是否可以编写一个
function_trait
来检查给定的函数参数是否为默认参数?
具体来说,我想稍后使用 SFINAE 使用此特性来启用/禁用给定的实现,具体取决于传递给函数的函数的最小/最大 arity,以及传递给函数的参数包的大小。
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
类型的函数是否可以用一定数量的参数少于其参数数来调用。
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 特征:模板函数中矩阵的平面图
- 特征模板化函数和维度
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 用于检测函数类型是否为否的特征
- 根据类型特征更改函数定义?
- 以特征类型作为参数的泛型函数回调
- 基于 SFINAE 的特征实现问题与函数模板重载
- 如何在没有返回值的情况下使用(特征)unaryExpr 和 lambda 函数?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 带有特征的函数指针
- 特征:创建一个具有函数的三维阵列
- 如何根据传递给函数的变量定义特征矩阵大小
- Lambda 函数在特征中按元素方向
- 特征运算符如何在内部解释为 MKL 函数?
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 使用特征函数失败
- 将函数应用于特征矩阵中的所有元素,而无需循环