函子重载最佳实践

functor overloading best practices

你好,我正在努力学习函子。这是一个简单的例子

struct A {
 double b,c;
 A(const double bb, const double cc) : b(bb), c(cc) {}
 double operator()(const double x, const double y) {
  return b*c*x*y;
 }
};

我想知道是否可以重载 A 以便它可以通过 bc 以及例如x 重用 operator() 中的代码。我的总体兴趣是不必在运算符中多次重写冗长的代码,并更好地理解这样做的最佳实践。

谢谢!

一种方法是在 <functional> 中使用 std::bind。这个 returns 一个你可以不带参数调用的闭包。另一种方法是为 ab 或派生的 class 创建一个具有默认参数的新构造函数,并将其重载为:

double operator()(const double x = m_x, const double y = m_y);

附带说明一下,请不要对成员函数的成员和参数使用相同的名称;这会产生歧义,如果您稍后重命名参数,甚至可能导致错误。

I would like to know if it is possible to overload A such that it could be passed b, c and also e.g. x reusing the code in the operator().

是的,做到这一点并不难。

double operator()(double x, double y) // Remove the const. It's useless.
{
   // Call the other overload using the member data.
   return (*this)(b, c, x, y);
}

double operator()(double bb, double cc, double x, double y)
{
   // Not using any member data at all.
   return bb*cc*x*y;
}