typedef nicht zuweisbar machen
-
Was kann man machen, dass es verboten ist unterschiedliche typedefs sich zuzuweisen?
Das soll z.B. nicht compilieren.typedef long long myID; typedef unsigned int mySIZE; int main() { myID id = 123456; mySIZE s = 6; id = s; //hätte gern hier compile error return 0; }
-
Ein typedef ist nur eine andere Bezeichnung für einen Datentyp, d.h. der Compiler sieht keinen Unterschied zwischen unsigned int und mySIZE. Wenn du die Möglichkeiten der Zuweisung einschränken willst, müsstest du schon eigene Wrapper-Klassen schreiben, die das ganze kapseln.
-
Vielleicht liessen sich enums verwenden.
BTW: ist es mit C++0x legal einen enum mit explizitem Basistypen zu machen, und da per Cast Werte reinzustecken die nicht als Enum-Konstanten definiert sind? Also sowas:
enum class A : int { nada = 1 }; enum class B : int { nada = 2 }; int main() { A a = A::nada; B b = B::nada; // a = b; // Der gewünschte fehler: cannot convert B to A a = static_cast<A>(123); // <- Ist dashier legal? (Compilieren tut es mit GCC, ohne Warning) }
-
hustbaer schrieb:
Vielleicht liessen sich enums verwenden.
BTW: ist es mit C++0x legal einen enum mit explizitem Basistypen zu machen, und da per Cast Werte reinzustecken die nicht als Enum-Konstanten definiert sind? Also sowas:
enum class A : int { nada = 1 }; enum class B : int { nada = 2 }; int main() { A a = A::nada; B b = B::nada; // a = b; // Der gewünschte fehler: cannot convert B to A a = static_cast<A>(123); // <- Ist dashier legal? (Compilieren tut es mit GCC, ohne Warning) }Legal ist so ein Cast immer, falls der konvertierte Wert nicht hineinpasst, ist das Ergebnis bloß unspezifiziert (5.2.9/10):
Er hat in diesem Fall auch das gewünschte Ergebnis, der Wertbereich einer fixierten Aufzählung ist der des zugrundeliegenden Typs (7.2/7).
-
Ja, die bessere Frage wäre gewesen: ist es "OK" sich darauf zu verlassen, dass der Wert bei
int -> enum_type -> inthinten wieder unverändert rauskommt, wenn die "Basis" vonenum_typeeinintist.Naja, cool, damit kann man ja was anfangen

-
Man könnte auch einfach die id const machen. Sooft dürfte die sich nicht ändern?

typedef const long long myID; typedef unsigned int mySIZE; int main() { myID id = 123456; mySIZE s = 6; id = s; //hätte gern hier compile error return 0; }
-
bmario schrieb:
Man könnte auch einfach die id const machen. Sooft dürfte die sich nicht ändern?

typedef const long long myID; typedef unsigned int mySIZE; int main() { myID id = 123456; mySIZE s = 6; id = s; //hätte gern hier compile error return 0; }
