将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)
Pass Member Function as Parameter to other Member Function (C++ 11 <function>)
假设我有一个class,有3个成员函数,如下:
#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);
}
我想要做的是将成员函数 "add" 传递给成员函数 "intermediate" 然后由 "combiner." 调用,但是,我不认为我使用正确的语法,因为当我尝试编译它时,我收到一条错误消息 "non-standard syntax; use '&' to create a pointer to member."
我不太确定出了什么问题,因为如果这些函数不是 class 中的成员函数(只是命名空间中定义的常规函数),则此方法可以完美运行。 那么是否可以将一个成员函数传递给另一个成员函数呢?
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
的任何成员)。例如
class ClassName
{
public:
static double add(double a, double b);
...
};
如果你真的想传递成员函数,你需要一个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);
}
假设我有一个class,有3个成员函数,如下:
#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);
}
我想要做的是将成员函数 "add" 传递给成员函数 "intermediate" 然后由 "combiner." 调用,但是,我不认为我使用正确的语法,因为当我尝试编译它时,我收到一条错误消息 "non-standard syntax; use '&' to create a pointer to member." 我不太确定出了什么问题,因为如果这些函数不是 class 中的成员函数(只是命名空间中定义的常规函数),则此方法可以完美运行。 那么是否可以将一个成员函数传递给另一个成员函数呢?
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
的任何成员)。例如
class ClassName
{
public:
static double add(double a, double b);
...
};
如果你真的想传递成员函数,你需要一个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);
}