Nun, die Antwort auf Ihre Frage über day * 3
ist: Ja, Sie können es tun. Sie brauchen dafür keinen Operator zu überladen. Und das Ergebnis wird 6
sein. Dies wird jedoch funktionieren, indem Sie Ihre day
-Konstante in einen int
-Typ umwandeln, eine Multiplikation innerhalb des int
-Typs durchführen und das Ergebnis vom Typ int
geben, d.h. dass 6
ein int
ist. Was die nächste Frage aufwirft: Geht es Ihnen gut, dass es ein int
ist?Was planen Sie danach mit diesem 6
? Wenn ein int
für Ihren Zweck in Ordnung ist, müssen Sie nichts tun.
Es ist jedoch möglich, dass Sie tatsächlich das Ergebnis field_type
Typ von day * 3
erhalten möchten. Sie sehen, in C++ int
Typ ist nicht explizit in Enum-Typen konvertierbar. So wird dies kompilieren und
int product = day * 3;
arbeiten, aber das wird nicht
field_type product = day * 3; // ERROR
Sie können die letztere zwingen, indem Sie eine explizite Umwandlung
field_type product = (field_type) (day * 3);
oder Sie starten mit Operator spielen kann zu kompilieren Überlastung, wie
field_type operator *(field_type lhs, int rhs)
{
return (field_type) ((int) lhs * rhs)
}
Beachten Sie, dass die Implementierung des überladenen Operators immer noch auf einem Cast basiert. Dies ist also nur eine Möglichkeit, den "Haupt" -Code Ihres Programms sauberer zu machen, indem die hässlichen Umwandlungen in dedizierte Operatoren gekapselt werden (nichts ist falsch).
Als eine pedantische Randbemerkung möchte ich hinzufügen, dass es gewisse formelle Gefahren gibt, wenn man versucht, die Ergebnisse ganzzahliger arithmetischer Operationen in einen Enum-Typ zu pressen (wenn Sie das wollen, vielleicht nicht Sie scheinen einen anderen Typ foo
für das Ergebnis zu verwenden, das keine Details darüber liefert). Der Wertebereich, den ein Enumerationsobjekt darstellen kann, wird [grob] durch den maximalen Wert (Betrag) der Enum-Konstante bestimmt, die auf die nächsthöhere (nach Größe) Zahl der Form 2^N-1
gerundet wird. In Ihrem Fall ist der höchste Wert day
gleich 2, was bedeutet, dass Ihre enum garantiert Werte bis zu 3
genau darstellt. Wenn Sie versuchen, 6
in Ihren Enum-Typ zu konvertieren, ist das Ergebnis nicht angegeben (obwohl es normalerweise "wie erwartet" in der Praxis funktioniert).
Was ist das 'foo' Typ? – AnT
foo ist eine komplexe Datenstruktur zum Beispiel 'struct foo {field_type type, int value; } ' – Artyom