#include <iostream>
template<typename Strategy>
struct Interface
{
public:
void call()
{
Strategy().call();
}
};
struct Flyable
{
public:
void call()
{
std::cout << "flyable" << std::endl;
}
};
struct Reachable
{
public:
void call()
{
std::cout << "reachable" << std::endl;
}
};
int main()
{
Interface<Flyable>().call();
Interface<Reachable>().call();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlPHR5cGVuYW1lIFN0cmF0ZWd5PgpzdHJ1Y3QgSW50ZXJmYWNlCnsKcHVibGljOgogICB2b2lkIGNhbGwoKQogICB7CiAgICAgIFN0cmF0ZWd5KCkuY2FsbCgpOwogICB9Cn07CiAKc3RydWN0IEZseWFibGUKewpwdWJsaWM6CiAgIHZvaWQgY2FsbCgpCiAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJmbHlhYmxlIiA8PCBzdGQ6OmVuZGw7CiAgIH0KfTsKIApzdHJ1Y3QgUmVhY2hhYmxlCnsKcHVibGljOgogICB2b2lkIGNhbGwoKQogICB7CiAgICAgIHN0ZDo6Y291dCA8PCAicmVhY2hhYmxlIiA8PCBzdGQ6OmVuZGw7CiAgIH0KfTsKIAppbnQgbWFpbigpCnsKICAgSW50ZXJmYWNlPEZseWFibGU+KCkuY2FsbCgpOwogICBJbnRlcmZhY2U8UmVhY2hhYmxlPigpLmNhbGwoKTsKfQ==