首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std函数构造函数初始化

std函数构造函数初始化
EN

Stack Overflow用户
提问于 2015-07-07 07:38:58
回答 1查看 3.7K关注 0票数 1

在阅读Scott Meyer的Effective C++之后,我开始尝试学习std::function。我编写了以下示例程序,为一个类提供了一个std::function对象

代码语言:javascript
复制
#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);
}

编译上面的代码会得到以下错误

代码语言:javascript
复制
error: invalid use of qualified-name 'FlyBehaviour::fly'

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

EN

回答 1

Stack Overflow用户

发布于 2015-07-07 07:55:16

您需要将FlyBehaviour对象bind到std::函数,或者在调用该函数时提供FlyBehavior。下面是前者的一个示例(请注意,我更改了typedef!):

代码语言:javascript
复制
#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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31257461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档