#include <string>
#include <iostream>
#include <functional>
// remember a struct is just a class whose members are, by default public!
struct hello_message
{
// function operator of type std::string(std::string const &) const
std::string operator () (std::string const & name) const
{
return "hello, " + name;
}
};
// this expects a functor to execute
void execute_functor(
std::function<std::string (std::string)> const & functor
)
{
auto && msg = functor("evilrix");
std::cout << msg << std::endl;
}
int main()
{
// create the function object
auto && hellomsg = hello_message();
// pass to the executor
execute_functor(hellomsg);
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAovLyByZW1lbWJlciBhIHN0cnVjdCBpcyBqdXN0IGEgY2xhc3Mgd2hvc2UgbWVtYmVycyBhcmUsIGJ5IGRlZmF1bHQgcHVibGljIQpzdHJ1Y3QgaGVsbG9fbWVzc2FnZQp7CiAgIC8vIGZ1bmN0aW9uIG9wZXJhdG9yIG9mIHR5cGUgc3RkOjpzdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QgJikgY29uc3QKICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IgKCkgKHN0ZDo6c3RyaW5nIGNvbnN0ICYgbmFtZSkgY29uc3QKICAgewogICAgICByZXR1cm4gImhlbGxvLCAiICsgbmFtZTsKICAgfQp9OwogCi8vIHRoaXMgZXhwZWN0cyBhIGZ1bmN0b3IgdG8gZXhlY3V0ZQp2b2lkIGV4ZWN1dGVfZnVuY3RvcigKICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZyAoc3RkOjpzdHJpbmcpPiBjb25zdCAmIGZ1bmN0b3IKICAgKQp7CiAgIGF1dG8gJiYgbXNnID0gZnVuY3RvcigiZXZpbHJpeCIpOwogICBzdGQ6OmNvdXQgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKfQogCmludCBtYWluKCkKewogICAvLyBjcmVhdGUgdGhlIGZ1bmN0aW9uIG9iamVjdAogICBhdXRvICYmIGhlbGxvbXNnID0gaGVsbG9fbWVzc2FnZSgpOwogCiAgIC8vIHBhc3MgdG8gdGhlIGV4ZWN1dG9yCiAgIGV4ZWN1dGVfZnVuY3RvcihoZWxsb21zZyk7Cn0=