Angenommen, ich habe eine Vorlagenfunktion und zwei Klassen
class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
Wie überprüfe ich, ob T ein Tier ist? Ich möchte nichts haben, das während der Laufzeit überprüft wird. Vielen Dank
Antworten:
Verwendung
is_same
:Normalerweise ist das jedoch ein völlig unbrauchbares Design, und Sie möchten sich wirklich spezialisieren :
Beachten Sie auch, dass es ungewöhnlich ist, Funktionsvorlagen mit expliziten (nicht abgeleiteten) Argumenten zu haben. Es ist nicht ungewöhnlich, aber oft gibt es bessere Ansätze.
quelle
T
nicht abgeleitet wird, können Sie nicht viel tun. Sie können die primäre Vorlage nicht implementieren und eine Spezialisierung erstellen oder eine statische Zusicherung mit hinzufügenis_same
.Ich denke heutzutage ist es besser zu verwenden, aber nur mit C ++ 17.
Wenn Sie einige typspezifische Operationen in if expression body without verwenden
constexpr
, wird dieser Code nicht kompiliert.quelle
std::is_same<T, U>::value
könnten Sie kürzere verwenden:std::is_same_v<T, U>
In C ++ 17 können wir Varianten verwenden .
Zur Verwendung
std::variant
müssen Sie den Header einschließen:Danach können Sie
std::variant
Ihren Code wie folgt hinzufügen :quelle
type
das ist der Wert des TypsType
oder eine Vorlage, die hier keinen Sinnis_same_v
ergibt ) im Kontext von nicht aussagekräftigvariant
. Das entsprechende "Merkmal" istholds_alternative
.std::variant
ist hier völlig unnötigSie können Ihre Vorlagen basierend auf den folgenden Parametern spezialisieren:
Beachten Sie, dass dadurch eine völlig neue Funktion erstellt wird, die auf dem Typ basiert, der als übergeben wird
T
. Dies ist normalerweise vorzuziehen, da es die Unordnung verringert und im Wesentlichen der Grund ist, warum wir überhaupt Vorlagen haben.quelle