#include <iostream>
template<class D>
struct widget
{
void foo() { reinterpret_cast<D*>(this)->bar(); }
};
struct gadget : private widget<gadget>
{
using widget::foo;
void bar() { std::cout << "gadget\n"; }
};
int main()
{
gadget g;
g.foo();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgRD4Kc3RydWN0IHdpZGdldAp7Cgl2b2lkIGZvbygpIHsgcmVpbnRlcnByZXRfY2FzdDxEKj4odGhpcyktPmJhcigpOyB9Cn07CgpzdHJ1Y3QgZ2FkZ2V0IDogcHJpdmF0ZSB3aWRnZXQ8Z2FkZ2V0Pgp7Cgl1c2luZyB3aWRnZXQ6OmZvbzsKCXZvaWQgYmFyKCkgeyBzdGQ6OmNvdXQgPDwgImdhZGdldFxuIjsgfQp9OwoKaW50IG1haW4oKQp7CglnYWRnZXQgZzsKCWcuZm9vKCk7Cn0K