Schreiben einer Funktionsvorlage, die auf eine Klasse und ihre Unterklassen spezialisiert ist

Ich versuche eine Funktionsvorlage zu schreiben. Eine Version sollte für alle Typen verwendet werden, die die Kriterien für die andere Version nicht erfüllen. Die andere Version sollte verwendet werden, wenn das Argument eine Basisklasse einer bestimmten Klasse oder diese Klasse selbst ist.

Ich habe versucht, eine Überlastung für zu tunBase&, aber wenn Klassen von abgeleitet sindBaseverwenden sie die allgemeine, nicht die spezifische.

Ich habe auch diesen SFINAE-Ansatz ausprobiert:

<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>

Aber alle von ihnen drucken "nicht besonders". Ich bin nicht gut in SFINAE und mache es wahrscheinlich nur falsch. Wie kann ich eine solche Funktion schreiben?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage