#include <iostream>
using namespace std;
template <typename T>
struct MyTest { // generic implementation for all types
MyTest() {
static_assert(is_pointer<T>::value , "this class must be used with a pointer");
}
};
template <typename T>
struct MyTest<T*> { // partial specialisation for pointer types
MyTest() {
cout <<"generic impmplementation"<<endl;
}
};
struct Base {};
struct Derived : Base {};
template <>
struct MyTest<Base*> { // specialisation for Base
MyTest() {
cout <<"specialized implementation for Base"<<endl;
}
};
template <>
struct MyTest<Derived*> { // specialisation for Derived
MyTest() {
cout <<"specialized implementation for Derived"<<endl;
}
};
//struct Base{} b;
//template<Base* B> struct Test{};
//template<> struct Test<&b>{};
//struct Derived : Base{} d;
//template<> struct Test<&d>{};
int main() {
// MyTest<Base> mt1; //<== faills because Base is not a poiner
MyTest<int*> mt0;
MyTest<Base*> mt2;
MyTest<Derived*> mt3;
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAKc3RydWN0IE15VGVzdCB7ICAgLy8gZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIHR5cGVzIAoJTXlUZXN0KCkgeyAKCQlzdGF0aWNfYXNzZXJ0KGlzX3BvaW50ZXI8VD46OnZhbHVlICwgInRoaXMgY2xhc3MgbXVzdCBiZSB1c2VkIHdpdGggYSBwb2ludGVyIik7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IE15VGVzdDxUKj4geyAvLyBwYXJ0aWFsIHNwZWNpYWxpc2F0aW9uIGZvciBwb2ludGVyIHR5cGVzCglNeVRlc3QoKSB7CiAJCWNvdXQgPDwiZ2VuZXJpYyBpbXBtcGxlbWVudGF0aW9uIjw8ZW5kbDsKCX0KfTsKCnN0cnVjdCBCYXNlIHt9OyAKc3RydWN0IERlcml2ZWQgOiBCYXNlIHt9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IE15VGVzdDxCYXNlKj4geyAgLy8gc3BlY2lhbGlzYXRpb24gZm9yIEJhc2UKCU15VGVzdCgpIHsKIAkJY291dCA8PCJzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgQmFzZSI8PGVuZGw7Cgl9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgTXlUZXN0PERlcml2ZWQqPiB7ICAvLyBzcGVjaWFsaXNhdGlvbiBmb3IgRGVyaXZlZAoJTXlUZXN0KCkgewogCQljb3V0IDw8InNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9uIGZvciBEZXJpdmVkIjw8ZW5kbDsKCX0KfTsKCi8vc3RydWN0IEJhc2V7fSBiOwovL3RlbXBsYXRlPEJhc2UqIEI+IHN0cnVjdCBUZXN0e307Ci8vdGVtcGxhdGU8PiBzdHJ1Y3QgVGVzdDwmYj57fTsKCi8vc3RydWN0IERlcml2ZWQgOiBCYXNle30gZDsKLy90ZW1wbGF0ZTw+IHN0cnVjdCBUZXN0PCZkPnt9OwoKCmludCBtYWluKCkgewoJLy8gTXlUZXN0PEJhc2U+IG10MTsgICAvLzw9PSBmYWlsbHMgYmVjYXVzZSBCYXNlIGlzIG5vdCBhIHBvaW5lcgogICAgTXlUZXN0PGludCo+IG10MDsKCU15VGVzdDxCYXNlKj4gbXQyOyAKCU15VGVzdDxEZXJpdmVkKj4gbXQzOyAKCQoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=