#include <iostream>
using namespace std;
class c1 {
public:
void f1(){std::cout<<"In f1\n";}
};
class c2 {
public:
void f2(){std::cout<<"In f2\n";}
};
template<typename> struct which_member;
template<> struct which_member<c1> {
static constexpr void (c1::* func)() = &c1::f1;
};
template<> struct which_member<c2> {
static constexpr void (c2::* func)() = &c2::f2;
};
template <typename T>
class C: public c1, c2 {
public:
void f() {
(static_cast<T*>(this)->*which_member<T>::func)();
}
};
int main()
{
C<c2> c;
c.f();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIGMxIHsKcHVibGljOgogICAgdm9pZCBmMSgpe3N0ZDo6Y291dDw8IkluIGYxXG4iO30KfTsKCmNsYXNzIGMyIHsKcHVibGljOgogICAgdm9pZCBmMigpe3N0ZDo6Y291dDw8IkluIGYyXG4iO30KfTsKCnRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3Qgd2hpY2hfbWVtYmVyOwoKdGVtcGxhdGU8PiBzdHJ1Y3Qgd2hpY2hfbWVtYmVyPGMxPiB7CiAgICBzdGF0aWMgY29uc3RleHByIHZvaWQgKGMxOjoqIGZ1bmMpKCkgPSAmYzE6OmYxOwkKfTsKCnRlbXBsYXRlPD4gc3RydWN0IHdoaWNoX21lbWJlcjxjMj4gewogICAgc3RhdGljIGNvbnN0ZXhwciB2b2lkIChjMjo6KiBmdW5jKSgpID0gJmMyOjpmMjsJCn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgQzogcHVibGljIGMxLCBjMiB7CnB1YmxpYzoKCiAgICB2b2lkIGYoKSB7CiAgICAgICAgKHN0YXRpY19jYXN0PFQqPih0aGlzKS0+KndoaWNoX21lbWJlcjxUPjo6ZnVuYykoKTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQzxjMj4gYzsKICAgIGMuZigpOwogICAgcmV0dXJuIDA7Cn0=