#include <iostream>
class A {
public:
virtual void f()=0;
};
class B : public A {
public:
};
class C : public A {
public:
};
class E {
public:
};
template<class Parent>
class D : public Parent {
static_assert(std::is_base_of<A,Parent>::value, "Not derived from A");
public:
void f() { std::cout << "Works"; }
};
class X : public D<B> {
public:
};
class Y : public D<C> {
public:
};
/*class Z : public D<E> {
This one gives a static_assert if its not E
};*/
int main() {
A * base = new X;
base->f();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCmNsYXNzIEEgewpwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgZigpPTA7CQp9OwoKY2xhc3MgQiA6IHB1YmxpYyBBIHsKcHVibGljOgkKCQp9OwoKY2xhc3MgQyA6IHB1YmxpYyBBIHsKcHVibGljOgp9OwoKY2xhc3MgRSB7CnB1YmxpYzoKCQp9OwoKdGVtcGxhdGU8Y2xhc3MgUGFyZW50PgpjbGFzcyBEIDogcHVibGljIFBhcmVudCB7CiAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPEEsUGFyZW50Pjo6dmFsdWUsICJOb3QgZGVyaXZlZCBmcm9tIEEiKTsKcHVibGljOgogICB2b2lkIGYoKSB7IHN0ZDo6Y291dCA8PCAiV29ya3MiOyB9Cn07CgpjbGFzcyBYIDogcHVibGljIEQ8Qj4gewpwdWJsaWM6Cgp9OwoKY2xhc3MgWSA6IHB1YmxpYyBEPEM+IHsKcHVibGljOgp9OwoKLypjbGFzcyBaIDogcHVibGljIEQ8RT4gewoJVGhpcyBvbmUgZ2l2ZXMgYSBzdGF0aWNfYXNzZXJ0IGlmIGl0cyBub3QgRQp9OyovCgppbnQgbWFpbigpIHsKCUEgKiBiYXNlID0gbmV3IFg7CgliYXNlLT5mKCk7CglyZXR1cm4gMDsKfQ==