在阅读Scott Meyer的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作为解决方案。有人能告诉我如何应用它吗,特别是我需要在哪里声明绑定了函数的对象?
发布于 2015-07-07 07:55:16
您需要将FlyBehaviour对象bind到std::函数,或者在调用该函数时提供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()。
https://stackoverflow.com/questions/31257461
复制相似问题