c++ - 指向成员变量和模板

标签 c++ templates c++11 functor pointer-to-member

我目前正在使用模板函数来评估数学函数的导数,就像这样

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

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

有没有一种简单的方法可以扩展它来评估作为类方法的函数的导数?我无法全神贯注地使用指向成员函数的函数指针,也无法弄清楚将仿函数作为类属性仍然可以访问其父类的属性和方法的细节。

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

最佳答案

在 C++11 中只需使用 lambda:

[&]( double x )->double {
  return ptr->method(x);
}

它生成一个可以用 double 调用的函数对象。上面的构造假定 lambda 将在当前作用域结束之前被使用和丢弃(否则 [&] 是不安全的)。

请注意,->double 可以在 C++11 中的单行和 void 返回 lambda 中省略,甚至在 C+ 中的多行 lambda 中也可以省略+1y 如果你对它推导的返回类型没问题(基于函数中的第一个 return 语句)。

在C++03中,可以使用std::mem_fun,也可以创建自定义函数对象。

在 C++1y 中:

[&](auto&&... x) {
  return ptr->method(std::forward<decltype(x)>(x)...);/
}

创建一个完美的转发仿函数包装器。在严肃的工业库代码之外,我很少会做那种事情,即使是在 C++1y 中也是如此。我们得到的不那么冗长:

[&](auto&&... x) {
  return ptr->method(x...);
}

这让我们可以不完美地转发,并将重载的选择推迟到 lambda 的使用点,而不是写入 lambda 的点,这可能很好。 (如果任何方法使用右值或按值调用,回到完美转发变得很诱人)

在 C++11 中,std::mem_fn 要求所讨论的方法不被重载,或者手动解析重载(使用神秘的转换)。 std::bind 然后用完美转发函数对象包装它。此过程的主要优点是可以确定构造的类型,而实现已定义,因此您可以拥有一个返回相关类型的函数。然而,这是一个非常深奥的优势:我会选择 lambda。

Lambda 虽然很奇怪,但在 C++ 中越来越普遍,并且根据我的经验,比链式 bind mem_fun 表达式更容易理解它们的作用,因为它们看起来更像“正常”代码(在你克服“魔法”之后)。

关于c++ - 指向成员变量和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23702783/

相关文章:

c++ - ADL 相关的 GCC 4.7.2 问题与表达式 SFINAE

c++ - 实现可变最小值/最大值函数

c++ - 使用 handle<> 构造此对象时,如何从 C++ 中的 python 取回有效对象?

c++ - 用 C++ 编写递归函数的最佳方法?

c++ - 静态多态性 : How to define the interface?

c++ - (C++) 双向链表模板 - 访问问题

c++ - 标准 C++11 是否保证传递给函数的临时对象会在函数结束后被销毁?

C++ libtins 构建错误

c++ - 如何完全减少/简化分数 (C++)

c++ - 在 QTcpServer 的子类中重载 Qt 函数