Escrevendo um modelo de função que é especializado para uma classe e suas subclasses

Eu estou tentando escrever um modelo de função. Uma versão deve ser usada para todos os tipos que não satisfazem os critérios da outra versão; a outra versão deve ser usada quando o argumento é uma classe base de uma determinada classe ou a própria classe.

Eu tentei fazer uma sobrecarga paraBase&, mas quando as aulas são derivadas deBase, eles usam o geral, não o específico.

Eu também tentei esta abordagem 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>

Mas todos eles imprimem "não especial". Eu não sou bom em SFINAE e provavelmente estou fazendo errado. Como posso escrever uma função assim?

questionAnswers(3)

yourAnswerToTheQuestion