#include <iostream>

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

template <typename T>
void f (T t) {
    static_assert (
        std::is_same<T, A>::value || std::is_base_of<A, T>::value, 
        "Type must be either A or derived from A."
    );

    std::cout << "Yay";
}

int main() {
    A a;
    B b;
    C c;
    f(c);
}