让我们说我有一个有三个成员函数的类,如下所示:
#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; 我不太确定出了什么问题,因为如果这些函数不是类中的成员函数(只是命名空间中定义的常规函数),则此方法可以正常工作。 是否可以将成员函数传递给另一个成员函数?
答案 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);
};
这只会略微改变intermediate
和combiner
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);
}