mercredi 20 juillet 2016

Understanding bind

I have a bit of trouble understanding a std::bind call. In the following example:

#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();
}

I don't understand how on_notify_(*this); calls back the functor with a Notifier& parameter, but the functor created by bind doesn't specify it. The calls result correctly to the void notify() method, but I don't understand what exactly will be the functor created by bind to result in this.

If I were to write a lambda instead, I would need to specify the parameter, otherwise it would compile. What kind of operation does bind here behind my back? :-)

Aucun commentaire:

Enregistrer un commentaire