#include <type_traits>

class A {};
class B : A {};
class C : A {};
class X{};

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

int main()
{
    D<C> d_valid;
    D<X> d_fails; // compilation fails
    
    return 0;
}