#include <iostream>
#include <type_traits>
class Base {};
class Derived : Base {};
class NotDerived {};
template <typename T>
class foo;
template <typename T>
class foo<T*>
{
static_assert(std::is_base_of<Base, T>::value, "Type is not a pointer to type derived from Base");
};
int main(int argc, const char* argv[])
{
foo<Base*> f1;
foo<Derived*> f2;
// foo<NotDerived*> f3; // Won't compile
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpjbGFzcyBCYXNlIHt9OwpjbGFzcyBEZXJpdmVkIDogQmFzZSB7fTsKY2xhc3MgTm90RGVyaXZlZCB7fTsKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgZm9vOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIGZvbzxUKj4KewogIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPEJhc2UsIFQ+Ojp2YWx1ZSwgIlR5cGUgaXMgbm90IGEgcG9pbnRlciB0byB0eXBlIGRlcml2ZWQgZnJvbSBCYXNlIik7Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKQp7CiAgZm9vPEJhc2UqPiBmMTsKICBmb288RGVyaXZlZCo+IGYyOwogIC8vIGZvbzxOb3REZXJpdmVkKj4gZjM7IC8vIFdvbid0IGNvbXBpbGUKICByZXR1cm4gMDsKfQ==