gpt4 book ai didi

c++ - 标准函数构造函数初始化

转载 作者:行者123 更新时间:2023-11-30 05:41:12 25 4
gpt4 key购买 nike

在阅读 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 作为解决方案。谁能告诉我如何应用它,特别是我需要在哪里声明绑定(bind)函数的对象?

最佳答案

您需要将一个 FlyBehaviour 对象绑定(bind) 到 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::bind绑定(bind)了一个FlyBehaviour 对象到第一个参数,使其成为 void()

关于c++ - 标准函数构造函数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com