C++ 函子重载最佳实践

C++ 函子重载最佳实践,c++,operator-overloading,operator-keyword,functor,C++,Operator Overloading,Operator Keyword,Functor,嗨,我正在努力掌握函子。下面是一个简单的例子 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,使其可以通过b,c,也可以通过x重用操作符()中的代码。我的总体兴趣是不必多次在操作符中重新编写冗长的代码,并且更

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

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,使其可以通过
b
c
,也可以通过
x
重用
操作符()中的代码。我的总体兴趣是不必多次在操作符中重新编写冗长的代码,并且更好地理解这样做的最佳实践


谢谢

一种方法是使用
中的
std::bind
。这将返回一个闭包,您可以不带参数地调用它。另一种方法是使用
a
b
或派生类的默认参数创建一个新构造函数,并将其重载为具有:

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

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

一种方法是使用
中的
std::bind
。这将返回一个闭包,您可以不带参数地调用它。另一种方法是使用
a
b
或派生类的默认参数创建一个新构造函数,并将其重载为具有:

double operator()(const double x = m_x, const double y = m_y);
作为旁注,请不要对成员函数的成员和参数使用相同的名称;这会产生歧义,如果以后重命名参数,甚至可能导致错误

我想知道是否有可能重载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;
}
我想知道是否有可能重载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;
}

不应该通过
b(bb),c(cc)
b(b),c(c)
?那是什么/在哪里?@Chad我的意思是
b
c
x
@Galik我的编译器对上面的格式很满意,在构造函数中,你觉得有必要重复使用
b*c*x*y
?不应该
b(bb),c(cc)
be
b(b),c(c)
?传递
a
?那是什么/在哪里?@Chad我的意思是
b
c
x
@Galik我的编译器对上面的格式很满意,在构造函数中,你觉得有必要重用一个做
b*c*x*y
的代码吗?@R Sahu你的解决方案正在我的代码中运行。非常感谢您直截了当地回答问题,特别是回答了被问到的问题@R Sahu您的解决方案在我的代码中运行。非常感谢您直截了当地回答问题,特别是回答了被问到的问题!