#include <iostream>
template<typename T>
struct CRTP_base
{
void execute()
{
static_cast<T*>(this)->f();
}
};
struct Foo : public CRTP_base<Foo>
{
void f()
{
std::cout << "Wow, compile-time resolved polymorphism!" << std::endl;
}
};
int main()
{
Foo my_foo_instance;
CRTP_base<Foo>& base_reference = my_foo_instance;
base_reference.execute();
};
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IENSVFBfYmFzZQp7CiAgICB2b2lkIGV4ZWN1dGUoKQogICAgewogICAgICAgIHN0YXRpY19jYXN0PFQqPih0aGlzKS0+ZigpOwogICAgfQp9OwoKc3RydWN0IEZvbyA6IHB1YmxpYyBDUlRQX2Jhc2U8Rm9vPgp7CiAgICB2b2lkIGYoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiV293LCBjb21waWxlLXRpbWUgcmVzb2x2ZWQgcG9seW1vcnBoaXNtISIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgIEZvbyBteV9mb29faW5zdGFuY2U7CiAgIENSVFBfYmFzZTxGb28+JiBiYXNlX3JlZmVyZW5jZSA9IG15X2Zvb19pbnN0YW5jZTsKICAgYmFzZV9yZWZlcmVuY2UuZXhlY3V0ZSgpOwp9Ow==