Pisanie szablonu funkcji, który specjalizuje się w klasie i jej podklasach

Próbuję napisać szablon funkcji. Jedna wersja powinna być używana dla wszystkich typów, które nie spełniają kryteriów dla innej wersji; druga wersja powinna być używana, gdy argument jest klasą bazową danej klasy lub samej klasy.

Próbowałem przeciążyćBase&, ale kiedy klasy pochodząBase, używają ogólnego, a nie konkretnego.

Próbowałem również tego podejścia SFINAE:

<code>struct Base { };

struct Derived : public Base { };

struct Unrelated { };

template<typename T>
void f(const T& a, bool b = true) {
    cout << "not special" << endl;
}

template<typename T>
void f(const Base& t, bool b = is_base_of<Base, T>::value) {
    cout << "special" << endl;
}

Base b;
Derived d;
Unrelated u;

f(b); f(d); f(u);
</code>

Ale wszystkie drukują „nie specjalne”. Nie jestem dobry w SFINAE i prawdopodobnie robię to źle. Jak mogę napisać taką funkcję?

questionAnswers(3)

yourAnswerToTheQuestion