如何将方法用作另一种方法的参数?

时间:2014-05-28 12:39:43

标签: c++ c++11

#include <functional>
#include <iostream>

class Foo{
  void print(std::function<void (void)> f){
    f();
    std::cout << "!";
  }
 void sayHello(){
   std::cout << "Hello";
 }
public:
  void tell(){
    print(sayHello);
  }
};

int main(){
  auto foo = Foo();
  foo.tell(); // 'Foo::sayHello': function call missing argument list; use '&Foo::sayHello' to create a pointer to member
}

我收到错误C3867: 'Foo::sayHello': function call missing argument list; use '&Foo::sayHello' to create a pointer to member。如果我使用&Foo::sayHello,那么我会得到一堆模板错误。

我做错了什么?

3 个答案:

答案 0 :(得分:4)

sayHello是一个非静态成员函数,因此它有一个隐含的第一个参数,this指针。让代码工作的最简单方法是使用一个捕获this指针的lambda表达式。

void tell(){
  print([this]{sayHello();});
}

另一个选项是std::bind

void tell(){
  print(std::bind(&Foo::sayHello, this));
}

答案 1 :(得分:3)

您希望将成员函数作为参数传递,但必须在对象实例上调用成员函数。

可能的解决方案如下:

void tell(){
    print(std::bind(&Foo::sayHello, this));
}

答案 2 :(得分:2)

成员函数有一个附加参数:this指针。你只是假设函数的声明没有

void (void)

bind()函数可以帮助您将指针绑定到它并返回适合std::function包装器的对象

#include <functional>
#include <iostream>

class Foo{
  void print(std::function<void (void)> f){
    f();
    std::cout << "!";
  }
  void sayHello(){
    std::cout << "Hello";
  }
public:
  void tell(){
    print(std::bind(&Foo::sayHello, this));
  }
};

int main(){
  auto foo = Foo();
  foo.tell();
}