#include <string>
#include <iostream>
#include <functional>
// remember a struct is just a class whose members are, by default public!
struct hello_message
{
// now we need a constructor to "pre-load" the functor with data
hello_message (std::string const & name)
: name_(name)
{
}
// function operator of type std::string() const
std::string operator () () const
{
return "hello, " + name_;
}
private:
std::string name_;
};
// this expects a functor to execute, it has no idea what it will output!
void execute_functor(std::function<std::string()> const & functor)
{
auto && msg = functor();
std::cout << msg << std::endl;
}
int main()
{
// create the function object
auto && hellomsg = hello_message("evilrix");
// pass to the executor
execute_functor(hellomsg);
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCi8vIHJlbWVtYmVyIGEgc3RydWN0IGlzIGp1c3QgYSBjbGFzcyB3aG9zZSBtZW1iZXJzIGFyZSwgYnkgZGVmYXVsdCBwdWJsaWMhCnN0cnVjdCBoZWxsb19tZXNzYWdlCnsKICAgLy8gbm93IHdlIG5lZWQgYSBjb25zdHJ1Y3RvciB0byAicHJlLWxvYWQiIHRoZSBmdW5jdG9yIHdpdGggZGF0YQogICBoZWxsb19tZXNzYWdlIChzdGQ6OnN0cmluZyBjb25zdCAmIG5hbWUpCiAgICAgIDogbmFtZV8obmFtZSkKICAgewogICB9CgogICAvLyBmdW5jdGlvbiBvcGVyYXRvciBvZiB0eXBlIHN0ZDo6c3RyaW5nKCkgY29uc3QKICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IgKCkgKCkgY29uc3QKICAgewogICAgICByZXR1cm4gImhlbGxvLCAiICsgbmFtZV87CiAgIH0KCiAgIHByaXZhdGU6CiAgICAgIHN0ZDo6c3RyaW5nIG5hbWVfOwp9OwoKLy8gdGhpcyBleHBlY3RzIGEgZnVuY3RvciB0byBleGVjdXRlLCBpdCBoYXMgbm8gaWRlYSB3aGF0IGl0IHdpbGwgb3V0cHV0IQp2b2lkIGV4ZWN1dGVfZnVuY3RvcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c3RyaW5nKCk+IGNvbnN0ICYgZnVuY3RvcikKewogICBhdXRvICYmIG1zZyA9IGZ1bmN0b3IoKTsKICAgc3RkOjpjb3V0IDw8IG1zZyA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkKewogICAvLyBjcmVhdGUgdGhlIGZ1bmN0aW9uIG9iamVjdAogICBhdXRvICYmIGhlbGxvbXNnID0gaGVsbG9fbWVzc2FnZSgiZXZpbHJpeCIpOwoKICAgLy8gcGFzcyB0byB0aGUgZXhlY3V0b3IKICAgZXhlY3V0ZV9mdW5jdG9yKGhlbGxvbXNnKTsKfQ==