将成员函数作为参数传递给其他成员函数(C ++ 11 <function>)

时间:2017-06-28 00:32:59

标签: c++ function std-function member-functions

让我们说我有一个有三个成员函数的类,如下所示:

#include <iostream>
#include <functional>

class ClassName
{
  public:
    double add(double a, double b);
    double intermediate(double a, double b, std::function<double (double,double)> func);
    double combiner(double a, double b);
};

double ClassName::add(double a, double b)
{
  return a+b;
}

double ClassName::intermediate(double a, double b, std::function<double (double,double)> func)
{
  return func(a, b);
}

double ClassName::combiner(double a, double b)
{
  return intermediate(a, b, add);
}

int main()
{
  ClassName OBJ;
  std::cout << OBJ.combiner(12, 10);
}

我想要做的是传递会员功能&#34;添加&#34;到成员函数&#34;中间&#34;然后由&#34;组合器调用。&#34;但是,我不认为我使用了正确的语法,因为当我尝试编译它时,我得到一个错误说&#34;非标准语法;使用&#39;&amp;&#39;创建指向成员的指针。&#34; 我不太确定出了什么问题,因为如果这些函数不是类中的成员函数(只是命名空间中定义的常规函数​​),则此方法可以正常工作。 是否可以将成员函数传递给另一个成员函数?

2 个答案:

答案 0 :(得分:6)

ClassName::add是一个非静态成员函数,需要ClassName的实例才能调用它;它不能直接用作std::function<double (double,double)>的参数。

您可以使用lambda并捕获this(正如@Igor Tandetnik所评论的那样):

return intermediate(a, b, [this](double x, double y) { return add(x, y); } );

或使用std::bind并绑定this指针:

return intermediate(a, b, std::bind(&ClassName::add, this, _1, _2));

或使ClassName::add成为静态成员函数或非成员函数(可能是因为它不使用ClassName的任何成员)。 e.g。

class ClassName
{
  public:
    static double add(double a, double b);
    ...
};

答案 1 :(得分:1)

如果您确实想要传递成员函数,则需要member function pointer

class ClassName
{
   public:
    double add(double a, double b);
    using Combiner = double (ClassName::*)(double, double);
    double intermediate(double a, double b, Combiner);
    double combiner(double a, double b);
};

这只会略微改变intermediatecombiner

的实施方式
double ClassName::intermediate(double a, double b, Combiner func)
{
  return (this->*func)(a, b);
}

double ClassName::combiner(double a, double b)
{
  return intermediate(a, b, &ClassName::add);
}