我正在查看this exemple here,结合std :: bind和std :: function以创建命令:真的很整洁!命令类的代码如下:
class Command
{
private:
std::function<void ()> _f;
public:
command() {}
command(std::function<void ()> f) : _f(f) {}
template <typename T> void setFunction (T t) {_f = t ;}
void execute()
{
if(!_f.empty())
_f();
}
};
假设我有一个包含成员函数的类MyClass
:
class MyClass
{
public:
void myMemberFn() {}
}
然后调用代码如下:
MyClass myClass;
command(std::bind(&MyClass::myMemberFn, myClass));
虽然我必须承认我并不真正理解为什么std::function
除std::bind
之外还需要Command
。在我看来bind已经封装了函数调用,为什么Command
需要函数?无法std::bind
存储std::function
而不是std::function
?
我一直在查看std::bind和std::function的文档,但没有得到它......
任何人都知道为什么需要{{1}}?
PS:我假设std :: bind~ = boost :: bind和std :: function~ = boost :: function
答案 0 :(得分:6)
您必须将std::bind
表达式的结果存储在某处。标准未指定std::bind
本身的返回类型,因此您无法创建该类型的命名成员变量(您可以使用C ++ 11 auto
来创建这样的局部变量! )
此外,任何使用std::function
的函数都可以(由于std::function
隐式转换)接受所有类型的可调用对象,而不仅仅是std::bind
结果 - 您可以将它传递给常规函数指针,一个lambda,一个自定义函数对象,无论可以调用什么。
答案 1 :(得分:1)
来自bind documnentation,
A function object of unspecified type T, for which std::is_bind_expression<T>::value == true,
and which can be stored in std::function.
所以
std::function<void ()> _f;
需要存储
的返回值command(std::bind(&MyClass::myMemberFn, myClass));
以便以后可以实际调用。