在阅读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作为解决方案。有人可以告诉我如何应用它,特别是在哪里需要声明绑定功能的对象?
答案 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::bind
将FlyBehaviour
对象绑定到第一个参数,使其成为void()
代替。