template<typename T>
class Base
{
template<typename U>
friend void f(void *ptr) {
static_cast<Base<U>*>(ptr)->run();
}
protected:
virtual void run() = 0;
};
class A : public Base<A>
{
protected:
virtual void run() {}
};
/*
class B : public Base<B>
{
protected:
virtual void run() {}
};
*/
int main()
{
A a;
f<A>(&a);
}
CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIEJhc2UKewogICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgogICBmcmllbmQgdm9pZCBmKHZvaWQgKnB0cikgewogICAgIHN0YXRpY19jYXN0PEJhc2U8VT4qPihwdHIpLT5ydW4oKTsKICAgfQogICBwcm90ZWN0ZWQ6CiAgICAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOyAKfTsKCmNsYXNzIEEgOiBwdWJsaWMgQmFzZTxBPgp7CiAgIHByb3RlY3RlZDoKICAgICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7fQp9OwoKLyoKY2xhc3MgQiA6IHB1YmxpYyBCYXNlPEI+CnsKICAgcHJvdGVjdGVkOgogICAgICAgdmlydHVhbCB2b2lkIHJ1bigpIHt9Cn07CiovCgppbnQgbWFpbigpCnsKICAgQSBhOwogICBmPEE+KCZhKTsKfQ==