std函数构造函数初始化

时间:2015-07-06 23:38:58

标签: c++ function-pointers

在阅读Scott Meyers Effective C ++之后,我开始尝试学习std :: function。我制作了以下示例程序,将std :: function对象赋予类

#include <iostream>
#include <string>
#include <functional>

class FlyBehaviour
{
  public :
  void fly()
  {
    std::cout<<"Flying";
    /* Work Here */
  }
};

typedef std::function<void(const FlyBehaviour&)> FlyFunc;

class Duck
{
  public :
  Duck(FlyFunc flyFunc) : _flyFunc(flyFunc){}

  private :

  FlyFunc _flyFunc;
};

int main()
{
  Duck(&FlyBehaviour::fly);
}

编译上面的代码会给我以下错误

error: invalid use of qualified-name 'FlyBehaviour::fly'

在研究方面,大多数互联网都指向使用std :: bind / boost :: bind作为解决方案。有人可以告诉我如何应用它,特别是在哪里需要声明绑定功能的对象?

1 个答案:

答案 0 :(得分:1)

在调用函数时,您需要将bind FlyBehaviour对象添加到std :: function或提供FlyBehavior。这是前者的一个例子(注意我改变了typedef!):

#include <iostream>
#include <string>
#include <functional>

class FlyBehaviour
{
  public :
  void fly()
  {
    std::cout<<"Flying";
    /* Work Here */
  }
};

typedef std::function<void()> FlyFunc;

class Duck
{
  public :
  Duck(FlyFunc flyFunc) : _flyFunc(flyFunc){}
  void run() {_flyFunc();}

  private :

  FlyFunc _flyFunc;
};

int main()
{
    FlyBehaviour f;
  Duck d(std::bind(&FlyBehaviour::fly, f));
  d.run();

此处,FlyBehaviour::fly的签名为void(FlyBehaviour&),但我使用std::bindFlyBehaviour对象绑定到第一个参数,使其成为void()代替。