#include <iostream>
#include <functional>
#include <string>
class Node
{
std::function<std::string()> execute;
public:
Node(std::function<std::string()> _execute)
: execute(std::move(_execute))
{
}
void output() const
{
std::cout << execute() << '\n';
}
};
std::string f1() { return "f1"; }
struct T { std::string f2() { return "f2"; } };
struct F { std::string operator ()() const { return "f3"; } };
int main()
{
T obj;
Node n1 { f1 };
Node n2 { std::bind(&T::f2, &obj) };
Node n3 { F() };
Node n4 { []() { return std::string("f4"); } };
n1.output();
n2.output();
n3.output();
n4.output();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHN0cmluZz4KCmNsYXNzIE5vZGUKewogICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBleGVjdXRlOwpwdWJsaWM6CiAgICBOb2RlKHN0ZDo6ZnVuY3Rpb248c3RkOjpzdHJpbmcoKT4gX2V4ZWN1dGUpCiAgICAgICAgOiBleGVjdXRlKHN0ZDo6bW92ZShfZXhlY3V0ZSkpCiAgICB7CiAgICB9CiAgICB2b2lkIG91dHB1dCgpIGNvbnN0CiAgICB7CiAgICAJc3RkOjpjb3V0IDw8IGV4ZWN1dGUoKSA8PCAnXG4nOwogICAgfQp9OwoKc3RkOjpzdHJpbmcgZjEoKSB7IHJldHVybiAiZjEiOyB9CnN0cnVjdCBUIHsgc3RkOjpzdHJpbmcgZjIoKSB7IHJldHVybiAiZjIiOyB9IH07CnN0cnVjdCBGIHsgc3RkOjpzdHJpbmcgb3BlcmF0b3IgKCkoKSBjb25zdCB7IHJldHVybiAiZjMiOyB9IH07CgppbnQgbWFpbigpCnsKICAgIFQgb2JqOwoKICAgIE5vZGUgbjEgeyBmMSB9OwogICAgTm9kZSBuMiB7IHN0ZDo6YmluZCgmVDo6ZjIsICZvYmopIH07CiAgICBOb2RlIG4zIHsgRigpIH07CiAgICBOb2RlIG40IHsgW10oKSB7IHJldHVybiBzdGQ6OnN0cmluZygiZjQiKTsgfSB9OwoKCW4xLm91dHB1dCgpOwoJbjIub3V0cHV0KCk7CgluMy5vdXRwdXQoKTsKCW40Lm91dHB1dCgpOwp9