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

标签 c++ function c++11 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);
}

我想做的是将成员函数“add”传递给成员函数“intermediate”,然后由“combiner”调用。但是,我不认为我使用了正确的语法,因为当我尝试编译它时,我收到一条错误消息“非标准语法;使用‘&’创建指向成员的指针。” 我不太确定出了什么问题,因为如果这些函数不是类中的成员函数(只是命名空间中定义的常规函数​​),则此方法可以完美运行。 那么是否可以将一个成员函数传递给另一个成员函数呢?

最佳答案

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并绑定(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);
    ...
};

关于c++ - 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791928/

相关文章:

C++11/模板 : Select the correct overloading of a function

c++ - 如何简化 x && (!y || (y && z))

c++ - 是否可以在 C++ 中将函数(-name)作为模板参数?

c++ - sizeof 运算符生成的数据类型

c++ - 类方法中的新指针必须转换为引用

c++ - std::vector 插入错误

c++ - 如何约束模板参数以符合 std::map 中的键?

c++ - 无法创建 MoveConstructibles 的 map

javascript - 回复 : A JavaScript Fn that accepts unknown # args - call Fn wrks - call via var does not

javascript - 如何修复此代码?单击按钮将获得 1 分,另一个按钮将获得 1 分