Написание шаблона функции, который специализирован для класса и его подклассов

Я пытаюсь написать шаблон функции. Одна версия должна использоваться для всех типов, которые не удовлетворяют критериям для другой версии; другая версия должна использоваться, когда аргумент является базовым классом данного класса или самим этим классом.

Я пытался сделать перегрузку дляBase&, но когда классы являются производными отBaseони используют общий, а не конкретный.

Я также попробовал этот подход 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>

Но все они печатаются "не особенные". Я не очень хорош в СФИНАЕ и, вероятно, просто делаю это неправильно. Как я могу написать такую функцию?

Ответы на вопрос(3)

Ваш ответ на вопрос