指向成员变量和模板

时间:2014-05-16 19:01:02

标签: c++ templates c++11 functor member-function-pointers

我目前正在使用模板化函数来评估数学函数的导数,如此

template <class func_type>
arma::mat matrixDerivative
   (func_type func, const double x, double h, double b=1.4) {
      // <implementation details>
}

模板参数允许我使用函数指针或函子来评估右侧。

有没有一种简单的方法来扩展它来评估类方法函数的派生?我无法解决使用函数指针到成员函数的问题,我无法解决将仿函数作为类属性仍可访问其父级的详细信息。属性和方法。

我的问题通常不清楚,所以在回答之前请随时在评论中要求澄清。

1 个答案:

答案 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}}表达更容易理解他们在做什么,因为它们看起来更像是“普通”代码(在你克服了“神奇”之后。)