#include <iostream>
class Base
{
};
class Derived : public Base
{
};
template <typename T>
typename std::enable_if<std::is_base_of<Base, T>::value>::type
foo()
{
std::cout << "Derived from Base" << std::endl;
}
template <typename T>
typename std::enable_if<!std::is_base_of<Derived, T>::value>::type
foo()
{
std::cout << "NOT derived from Base" << std::endl;
}
template <typename T> class MyClass
{
public:
void f()
{
foo<T>();
}
};
int main()
{
MyClass<int> x;
MyClass<Derived> y;
x.f();
y.f();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQmFzZQp7Cn07CgpjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UKewp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxCYXNlLCBUPjo6dmFsdWU+Ojp0eXBlCmZvbygpCnsKICAgIHN0ZDo6Y291dCA8PCAiRGVyaXZlZCBmcm9tIEJhc2UiIDw8IHN0ZDo6ZW5kbDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2Jhc2Vfb2Y8RGVyaXZlZCwgVD46OnZhbHVlPjo6dHlwZQpmb28oKQp7CiAgICBzdGQ6OmNvdXQgPDwgIk5PVCBkZXJpdmVkIGZyb20gQmFzZSIgPDwgc3RkOjplbmRsOwp9CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE15Q2xhc3MKewpwdWJsaWM6CiAgIHZvaWQgZigpCiAgIHsKICAgICAgZm9vPFQ+KCk7CiAgIH0KfTsKCmludCBtYWluKCkKewogICBNeUNsYXNzPGludD4geDsKICAgTXlDbGFzczxEZXJpdmVkPiB5OwogICB4LmYoKTsKICAgeS5mKCk7Cn0K