#include <iostream>
#include <memory>
template <int T>
class E
{
public:
template <typename ... ArgTypes>
class Base
{
public:
void operator()(ArgTypes ... args)
{
On(nullptr, args...);
}
virtual void On(Base<ArgTypes...>*, ArgTypes...) = 0;
};
};
class A : public E<0>::Base<int>
, public E<1>::Base<int>
{
public:
void On(E<0>::Base<int>*, int val) override
{
std::cout << "E<0>::Base<int> called: " << val << std::endl;
}
void On(E<1>::Base<int>*, int val) override
{
std::cout << "E<1>::Base<int> called: " << val*val << std::endl;
}
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
a->E<0>::Base<int>::operator()(2);
a->E<1>::Base<int>::operator()(2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKdGVtcGxhdGUgPGludCBUPgpjbGFzcyBFCnsKcHVibGljOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIC4uLiBBcmdUeXBlcz4KICAgIGNsYXNzIEJhc2UKICAgIHsKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIG9wZXJhdG9yKCkoQXJnVHlwZXMgLi4uIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBPbihudWxscHRyLCBhcmdzLi4uKTsKICAgICAgICB9CiAgICAgICAgdmlydHVhbCB2b2lkIE9uKEJhc2U8QXJnVHlwZXMuLi4+KiwgQXJnVHlwZXMuLi4pID0gMDsKICAgIH07Cn07CgpjbGFzcyBBIDogcHVibGljIEU8MD46OkJhc2U8aW50PgogICAgICAgICwgcHVibGljIEU8MT46OkJhc2U8aW50Pgp7CnB1YmxpYzoKCiAgICB2b2lkIE9uKEU8MD46OkJhc2U8aW50PiosIGludCB2YWwpIG92ZXJyaWRlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJFPDA+OjpCYXNlPGludD4gY2FsbGVkOiAiIDw8IHZhbCA8PCBzdGQ6OmVuZGw7CiAgICB9ICAKCiAgICB2b2lkIE9uKEU8MT46OkJhc2U8aW50PiosIGludCB2YWwpIG92ZXJyaWRlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJFPDE+OjpCYXNlPGludD4gY2FsbGVkOiAiIDw8IHZhbCp2YWwgPDwgc3RkOjplbmRsOwogICAgfSAgCn07CgppbnQgbWFpbigpIHsKCXN0ZDo6c2hhcmVkX3B0cjxBPiBhID0gc3RkOjptYWtlX3NoYXJlZDxBPigpOwoJYS0+RTwwPjo6QmFzZTxpbnQ+OjpvcGVyYXRvcigpKDIpOwoJYS0+RTwxPjo6QmFzZTxpbnQ+OjpvcGVyYXRvcigpKDIpOwoJCglyZXR1cm4gMDsKfQ==