std :: bind和std :: function重叠或互补?

时间:2013-12-24 09:07:48

标签: c++ boost c++11 stl

我正在查看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::functionstd::bind之外还需要Command。在我看来bind已经封装了函数调用,为什么Command需要函数?无法std::bind存储std::function而不是std::function

我一直在查看std::bindstd::function的文档,但没有得到它......

任何人都知道为什么需要{{1}}?

PS:我假设std :: bind~ = boost :: bind和std :: function~ = boost :: function

2 个答案:

答案 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));

以便以后可以实际调用。