#include <iostream>
#include <type_traits>
struct MyClass {
virtual void debug () const {
std::cout << "MyClass" << std::endl;
};
};
struct MyClassDer : public MyClass {
virtual void debug () const {
std::cout << "MyClassDer" << std::endl;
};
};
template <
typename T
>
void func (const T& t, typename std::enable_if<!std::is_base_of<MyClass, T>::value>::type * = nullptr) {
std::cout << "func template" << std::endl;
}
template <
typename T
, typename = typename std::enable_if<std::is_base_of<MyClass, T>::value>::type
>
void func (const T& t) {
std::cout << "func overloaded" << std::endl;
t.debug ();
}
int main(int argc, char **argv) {
func (1);
MyClass myClass;
func (myClass);
MyClassDer myClassDer;
func (myClassDer);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgTXlDbGFzcyB7CiAgICB2aXJ0dWFsIHZvaWQgZGVidWcgKCkgY29uc3QgewogICAgICAgIHN0ZDo6Y291dCA8PCAiTXlDbGFzcyIgPDwgc3RkOjplbmRsOwogICAgfTsKfTsKCnN0cnVjdCBNeUNsYXNzRGVyIDogcHVibGljIE15Q2xhc3MgewogICAgdmlydHVhbCB2b2lkIGRlYnVnICgpIGNvbnN0IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIk15Q2xhc3NEZXIiIDw8IHN0ZDo6ZW5kbDsKICAgIH07Cn07Cgp0ZW1wbGF0ZSA8Cgl0eXBlbmFtZSBUCj4Kdm9pZCBmdW5jIChjb25zdCBUJiB0LCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19iYXNlX29mPE15Q2xhc3MsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpIHsKICAgIHN0ZDo6Y291dCA8PCAiZnVuYyB0ZW1wbGF0ZSIgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8Cgl0eXBlbmFtZSBUCgksIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPE15Q2xhc3MsIFQ+Ojp2YWx1ZT46OnR5cGUKPgp2b2lkIGZ1bmMgKGNvbnN0IFQmIHQpIHsKICAgIHN0ZDo6Y291dCA8PCAiZnVuYyBvdmVybG9hZGVkIiA8PCBzdGQ6OmVuZGw7CiAgICB0LmRlYnVnICgpOwp9CgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBmdW5jICgxKTsKICAgIE15Q2xhc3MgbXlDbGFzczsKICAgIGZ1bmMgKG15Q2xhc3MpOwogICAgTXlDbGFzc0RlciBteUNsYXNzRGVyOwogICAgZnVuYyAobXlDbGFzc0Rlcik7Cn0=