类方法作为函数参数

时间:2013-02-04 10:15:48

标签: c++ c++11

我试图将一些类方法传递给某个函数并使用"函数调用缺少参数列表;使用'& '创建指向成员的指针"错误。

//There is some class
class A {
  int someField;
  void Add(int someAdd) {
    someField += someAdd;
  }
}

//And function
void someFunc(std::function<void(int x)> handler) {
  //Some code
  handler(234);
}

//Class method pass to function
void main() {
  A* instanceA = new A();
  someFunc(instanceA->Add); //Error 19  error C3867: 'A::Add': function call missing argument list; use '&A::Add' to create a pointer to member
}

出了什么问题?

3 个答案:

答案 0 :(得分:9)

C ++没有绑定方法作为语言构造。写:

someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));

答案 1 :(得分:3)

您需要在稍后传递参数时使用std::bind和占位符:

#include <functional>
someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));

另请注意,您需要A::Add公开

class A {    
  int someField;

public:
  void Add(int someAdd) {
    someField += someAdd;
  }
};

另请注意,在C ++标准中没有void main

int main() 
{
    someFunc(std::bind(&A::Add, instanceA, std::placeholders::_1));
}

答案 2 :(得分:1)

而不是其他答案中的std::bind内容我想建议使用lambdas,因为它们更具可读性:

int main() {
  A* instanceA = new A();
  someFunc([=](int a1, int a2)
  {
    instanceA->Add(a1, a2);
  }); 
}   

我知道,如果Add需要四个,五个......“BigN”参数,它会变得很长,因为你必须在lambda的参数列表中重复它们,但当然你知道如何编写干净的代码并且不要不为Add提供“BigN”参数; - )