#include <iostream>
#include <functional>
struct PrintHello
{
void operator () ()
{
std::cout << "Hello";
}
};
struct PrintWorld
{
void operator () ()
{
std::cout << "World";
}
};
template<typename Func>
class FooBar
{
public:
FooBar()
{
}
FooBar(Func _func) : func(_func)
{
}
void print()
{
func();
}
private:
Func func;
};
void freeFunction()
{
std::cout << "I'm free";
}
int main()
{
FooBar<PrintHello> hello;
FooBar<PrintWorld> world;
FooBar<std::function<void()>> free_func(freeFunction);
hello.print();
std::cout << std::endl;
world.print();
std::cout << std::endl;
free_func.print();
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBQcmludEhlbGxvCnsKICAgIHZvaWQgb3BlcmF0b3IgKCkgKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkhlbGxvIjsKICAgIH0KfTsKCnN0cnVjdCBQcmludFdvcmxkCnsKICAgIHZvaWQgb3BlcmF0b3IgKCkgKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIldvcmxkIjsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CmNsYXNzIEZvb0Jhcgp7CnB1YmxpYzoKICAgIEZvb0JhcigpIAogICAgewogICAgfQogICAgCiAgICBGb29CYXIoRnVuYyBfZnVuYykgOiBmdW5jKF9mdW5jKSAKICAgIHsKICAgIH0KICAgIAogICAgdm9pZCBwcmludCgpCiAgICB7CiAgICAgICAgZnVuYygpOwogICAgfQoKcHJpdmF0ZToKICAgIEZ1bmMgZnVuYzsKfTsKCnZvaWQgZnJlZUZ1bmN0aW9uKCkKewogICAgc3RkOjpjb3V0IDw8ICJJJ20gZnJlZSI7Cn0KCmludCBtYWluKCkKewogICAgRm9vQmFyPFByaW50SGVsbG8+IGhlbGxvOwogICAgRm9vQmFyPFByaW50V29ybGQ+IHdvcmxkOwogICAgRm9vQmFyPHN0ZDo6ZnVuY3Rpb248dm9pZCgpPj4gZnJlZV9mdW5jKGZyZWVGdW5jdGlvbik7CiAgICBoZWxsby5wcmludCgpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIHdvcmxkLnByaW50KCk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgZnJlZV9mdW5jLnByaW50KCk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0K