#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;
}