#include <iostream>
#include <functional>
using namespace std;
class Functor : public std::function<bool()> {
public:
virtual ~Functor() {};
virtual bool operator()() const {return false;};
};
class FunctorTrue : public Functor{
public:
bool operator()() const {return true;}
};
class Dispatcher {
public:
const Functor & mFunctor;
Dispatcher(const Functor & functor): mFunctor(functor) {}
Dispatcher(const Functor && functor): mFunctor(functor) {
cout << "Constructor with rvalue" << endl;
}
void dispatch(){
cout << boolalpha << mFunctor() << endl;
}
};
int main() {
Dispatcher dt = Dispatcher(FunctorTrue());
dt.dispatch();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEZ1bmN0b3IgOiBwdWJsaWMgc3RkOjpmdW5jdGlvbjxib29sKCk+IHsKcHVibGljOgoJdmlydHVhbCB+RnVuY3RvcigpIHt9OwoJdmlydHVhbCBib29sIG9wZXJhdG9yKCkoKSBjb25zdCB7cmV0dXJuIGZhbHNlO307Cn07CgpjbGFzcyBGdW5jdG9yVHJ1ZSA6IHB1YmxpYyBGdW5jdG9yewpwdWJsaWM6Cglib29sIG9wZXJhdG9yKCkoKSBjb25zdCB7cmV0dXJuIHRydWU7fQp9OwoKY2xhc3MgRGlzcGF0Y2hlciB7CnB1YmxpYzoKCWNvbnN0IEZ1bmN0b3IgJiBtRnVuY3RvcjsgCglEaXNwYXRjaGVyKGNvbnN0IEZ1bmN0b3IgJiBmdW5jdG9yKTogbUZ1bmN0b3IoZnVuY3Rvcikge30KCURpc3BhdGNoZXIoY29uc3QgRnVuY3RvciAmJiBmdW5jdG9yKTogbUZ1bmN0b3IoZnVuY3RvcikgewoJCWNvdXQgPDwgIkNvbnN0cnVjdG9yIHdpdGggcnZhbHVlIiA8PCBlbmRsOwoJfQoJCgl2b2lkIGRpc3BhdGNoKCl7CgkJY291dCA8PCBib29sYWxwaGEgPDwgbUZ1bmN0b3IoKSA8PCBlbmRsOwoJfQp9OwoKaW50IG1haW4oKSB7CglEaXNwYXRjaGVyIGR0ID0gRGlzcGF0Y2hlcihGdW5jdG9yVHJ1ZSgpKTsKCWR0LmRpc3BhdGNoKCk7Cn0=