Ich habe eine Basisklasse Base
, von der viele andere Klassen abgeleitet werden. Ich würde gerne definieren:
Aber nur für Klassen, die von Base
abgeleitet sind. Ich brauche alle zuvor definierten operator<<
für andere Typen. Wie geht das? Ist das möglich?
Ich kann ostream &operator<< (ostream &o, Base &base)
nicht erstellen, weil ich den genauen Typ brauche, der in einigen Typeigenschaften verwendet werden soll. Gibt es eine Möglichkeit, den abgeleiteten Typ zu "schieben", während der Wert als Basistyp übergeben wird?
Sie können Typeigenschaften und SFINAE verwenden, um nur von Base abgeleitete Klassen in Ihre Funktion zu lassen:
%Vor%Eine weitere Option besteht darin, von einer Markierungsvorlage
abzuleiten %Vor%Dann leite sie von beiden ab
%Vor%Jetzt können Sie es als
schreiben %Vor% Der Vorteil ist seine Einfachheit. Und wenn Base
bereits als Vorlage verwendet wird, ist es sogar noch nützlicher (ich nehme an, dass dies für Ihren Code nicht der Fall ist).
Sie können die is_base_of
-Klassenvorlage verwenden, um sicherzustellen, dass nur abgeleitete Klassen von Base
operator<<
:
Sie finden die Definition von is_base_of
in einem anderen Thema bei stackoverflow selbst: hier klicken
Und hier ist die Definition von static_assert
: