函子重载最佳实践

functor overloading best practices

本文关键字:最佳 重载      更新时间:2023-10-16

嗨,我正在努力掌握函子。下面是一个简单的示例

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()中的代码。我的总体兴趣是不必多次在运算符中重写冗长的代码,并更好地理解这样做的最佳实践。

谢谢!

我想知道是否可以重载A,使其可以传递b、c,例如x,重用运算符()中的代码。

是的,这样做并不难。

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;
}

执行此操作的一种方法是在<functional>中使用std::bind。这将返回一个闭包,您可以在不带参数的情况下调用该闭包。另一种选择是为ab创建一个带有默认参数的新构造函数,或者创建一个派生类,并将其重载为具有:

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

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