#include <iostream>
#include <type_traits>
using namespace std;

struct A{};
struct B : public A{};
struct Bb : B{};
struct X {};

template<typename T>
class D {
 static_assert(std::is_base_of<A,T>::value, "not derived from A");
};

int main() {
 D<B>();
 D<Bb>();
 D<X>();
 return 0;
}