我目前正在使用模板化函数来评估数学函数的导数,如此
template <class func_type>
arma::mat matrixDerivative
(func_type func, const double x, double h, double b=1.4) {
// <implementation details>
}
模板参数允许我使用函数指针或函子来评估右侧。
有没有一种简单的方法来扩展它来评估类方法函数的派生?我无法解决使用函数指针到成员函数的问题,我无法解决将仿函数作为类属性仍可访问其父级的详细信息。属性和方法。
我的问题通常不清楚,所以在回答之前请随时在评论中要求澄清。
答案 0 :(得分:3)
在C ++ 11中,只需使用lambda:
[&]( double x )->double {
return ptr->method(x);
}
生成可以使用double
调用的函数对象。上面的结构假定lambda将在当前作用域结束之前被使用和丢弃(否则[&]
是不安全的)。
请注意,对于C ++ 11中的单行和->double
返回lambda,void
可以省略,如果你对C ++ 1中的多行lambda也省略了return
它推导的返回类型(基于函数中的第一个std::mem_fun
语句)。
在C ++ 03中,可以使用[&](auto&&... x) {
return ptr->method(std::forward<decltype(x)>(x)...);/
}
,也可以创建自定义函数对象。
在C ++ 1y中:
[&](auto&&... x) {
return ptr->method(x...);
}
创建一个完美转发函子包装器。即使在C ++ 1y中,我也很少会做那种事情,除了严肃的工业库代码之外。我们得到的更简洁:
std::mem_fn
让我们不完美地转发,并将过载的选择推迟到lambda的使用点,而不是写入lambda的点,这可能很好。 (如果任何方法使用rvalue或by-value调用,那么返回完美转发会变得很诱人)
在C ++ 11中,std::bind
要求所讨论的方法不要重载,或者手动解决重载(使用看似神秘的转换)。然后bind
用完美转发函数对象包装它。此过程的主要优点是可以确定构造的类型,同时可以确定实现,因此您可以使用返回相关类型的函数。然而,这是一个非常深奥的优势:我会选择lambda。
Lambda虽然很奇怪,但在C ++中越来越常见,并且在我的体验中比链mem_fun
{{1}}表达更容易理解他们在做什么,因为它们看起来更像是“普通”代码(在你克服了“神奇”之后。)