- #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==