理解绑定

时间:2016-07-21 02:10:48

标签: c++ c++11 stl bind

我在理解std :: bind调用时遇到了一些麻烦。 在以下示例中:

#include <functional>
#include <iostream>
#include <memory>


class Notifier
{
public:
    Notifier(std::function<void(Notifier&)> on_notify)
  :on_notify_(on_notify)
  { }

    void notify()
    {
        if (on_notify_)
            on_notify_(*this);
    }

    std::function<void(Notifier&)> on_notify_;

};

struct Manager
{
    Manager()
    {
        n_ = std::make_unique<Notifier>(std::bind(&Manager::trigger, this));
    }

    void trigger()
    {
        std::cout << "notified" << std::endl;
    }

    std::unique_ptr<Notifier> n_;
};

int main()
{
    Manager s;
    s.n_->notify();
}

我不明白on_notify_(*this);如何使用Notifier&参数回调仿函数,但bind创建的仿函数并未指定它。 调用正确地导致了void notify()方法,但我不明白绑定创建的仿函数到底会产生什么。

如果我要写一个lambda,我需要指定参数,否则它会编译。 我背后的bind是什么样的操作? : - )

1 个答案:

答案 0 :(得分:2)

std::bind基本上根据this忽略无效的给定参数。

  

如果调用g()时提供的某些参数与存储在g中的任何占位符不匹配,则会评估并丢弃未使用的参数。

如果提供更多荒谬的参数,绑定的仿函数仍然可以成功到达Manager::trigger(),可能会让您感到惊讶:

#include <functional>
#include <iostream>
#include <memory>

// Some classes that have nothing to do with on_notify_
class AAA {};
class BBB {};

class Notifier
{
public:
    Notifier(std::function<void(AAA&, BBB&)> on_notify)
        :on_notify_(on_notify)
    { }

    void notify()
    {
        if (on_notify_)
        {
            // Arguments not matching.
            AAA a{};
            BBB b{};

            // Invoke with them.
            on_notify_(a, b);
        }
    }

    std::function<void(AAA&, BBB&)> on_notify_;
};

struct Manager
{
    Manager()
    {
        n_ = std::make_unique<Notifier>(std::bind(&Manager::trigger, this));
    }

    void trigger()
    {
        std::cout << "it's also notified!" << std::endl;
    }

    std::unique_ptr<Notifier> n_;
};

int main()
{
    Manager s;
    s.n_->notify();
}

现场演示是here