【问题标题】:functor overloading best practices函子重载最佳实践
【发布时间】:2015-11-19 20:52:54
【问题描述】:

您好,我正在尝试掌握函子。这是一个简单的例子

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

谢谢!

【问题讨论】:

  • 不应该b(bb), c(cc)b(b), c(c)
  • 通过a?那是什么/在哪里?
  • @Chad 我的意思是bcx
  • @Galik 我的编译器对上述表格很满意
  • 在构造函数的什么地方,你觉得有必要重用做b * c * x * y的代码吗?

标签: c++ operator-overloading operator-keyword functor


【解决方案1】:

我想知道是否可以重载 A 以便可以通过 b、c 以及例如x 重用 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;
}

【讨论】:

  • @R Sahu 您的解决方案在我的代码中运行。非常感谢您直截了当,特别是回答了所提出的问题!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多