#include <iostream>
#include <type_traits>
template<typename T>
typename std::enable_if<std::is_polymorphic<T>::value, void*>::type
startOfObject(T* p)
{
std::cout << "is polymorphic" << std::endl;
return dynamic_cast<void*>(p);
}
template<typename T>
typename std::enable_if<!std::is_polymorphic<T>::value, void*>::type
startOfObject(T* p)
{
std::cout << "is not polymorphic" << std::endl;
return static_cast<void*>(p);
}
class C {};
class Polymorphic { public: virtual ~Polymorphic() {} };
int main() {
C c;
Polymorphic p;
startOfObject(&c);
startOfObject(&p);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvbHltb3JwaGljPFQ+Ojp2YWx1ZSwgdm9pZCo+Ojp0eXBlCnN0YXJ0T2ZPYmplY3QoVCogcCkKewogICAgc3RkOjpjb3V0IDw8ICJpcyBwb2x5bW9ycGhpYyIgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIGR5bmFtaWNfY2FzdDx2b2lkKj4ocCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3BvbHltb3JwaGljPFQ+Ojp2YWx1ZSwgdm9pZCo+Ojp0eXBlCnN0YXJ0T2ZPYmplY3QoVCogcCkKewogICAgc3RkOjpjb3V0IDw8ICJpcyBub3QgcG9seW1vcnBoaWMiIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4ocCk7Cn0KCmNsYXNzIEMge307CmNsYXNzIFBvbHltb3JwaGljIHsgcHVibGljOiB2aXJ0dWFsIH5Qb2x5bW9ycGhpYygpIHt9IH07CgoKaW50IG1haW4oKSB7CiAgICBDIGM7CiAgICBQb2x5bW9ycGhpYyBwOwoKICAgIHN0YXJ0T2ZPYmplY3QoJmMpOwogICAgc3RhcnRPZk9iamVjdCgmcCk7CiAgICByZXR1cm4gMDsKfQoK