Parametertyp "explizit" erzwingen.
-
Hallo miteinander!
Ich suche schon seit Tagen erfolglos, wie ich folgendes erreichen kann:
Die an eine Methode übergebenen Parameter sollen exakt dem deklarierten Typ entsprechen (kein implizites casting), andernfalls soll ein Fehler beim Kompilieren auftreten.
Beispiel:
typedef bool TypA;
typedef bool TypB;
void method(TypA parameter);Nicht akzeptiert werden sollen in diesem Beispiel:
TypB var1;
method(var1) oder
bool var2;
method(var2);Der Sinn darin ist übrigens, daß ich mir zu jeder Methode einen Satz Konstanten definieren möchte, die den Verlauf der Methode steuern. Dabei sollen die Konstanten für die verschiedenen Methoden nicht verwechselt werden können. Momentan kann man aber halt schlicht alle verwenden, da sie implizit auf bool gecasted werden.
Ich würde mich sehr über darüber freuen, wenn sich einer von Euch die Zeit dafür nimmt, mir hierin zu helfen.
Gruß
stroustrup
PS: Diesen Namen habe ich mir wohl eigentlich noch nicht verdient. *g*
-
stroustrup schrieb:
Hallo miteinander!
Ich suche schon seit Tagen erfolglos, wie ich folgendes erreichen kann:
Die an eine Methode übergebenen Parameter sollen exakt dem deklarierten Typ entsprechen (kein implizites casting), andernfalls soll ein Fehler beim Kompilieren auftreten.
Kleiner Hinweis: der Prozess er Umwandlung eines Ausdrucks in einen Ausdruck mit anderem Typ ist eine Konvertierung (oder Konversion oder einfach Umwandlung etc.). Eine Konvertierung kann explizit oder implizit erfolgen, dass bezieht sich auf die Ursache der Konvertierung, genauer: die grammatikalische Form. In C++ existieren 6 verschiedene grammatikalische Formen (Casts), die eine bestimmte Umwandlung des Arguments bewirken - die so erzwungene Umwandlung ist dann explizit. Konvertierungen aus anderen Gründen sind dem entsprechend implizit. Ein "impliziter Cast" ist dagegen ein Oxymoron. Das aber nur als Hinweis, diese Begriffe werden sehr oft verwechselt oder synonym gebraucht - meinem Eindruck nach fehlt es dabei in der Regel am nötigen Verständnis.
Impliziter Konvertierungen beim Aufruf von Funktionen werden (weitgehend) unterdrückt, wenn der betreffende Parameter deduziert werden muss, also eine Templatefunktion benutzt wird. Mittels SFINAE es dabei möglich, den möglichen Spielraum für den zu deduzierenden Parameter beliebig einzuschränken.
template <typename T> typename boost::enable_if< boost::is_same< T, bool > >::type method(T arg);stroustrup schrieb:
PS: Diesen Namen habe ich mir wohl eigentlich noch nicht verdient. *g*
Nein, und diese Wahl ist auch ziemlich idiotisch - aber darin bist du natürlich frei.
-
stroustrup schrieb:
Ich suche schon seit Tagen erfolglos, wie ich folgendes erreichen kann:
typedef definiert keinen neuen Typen sondern nur einen neuen Namen für einen Typen. Das ist auch so eine C-Altlast. (Ergo geht es nicht!) Schreib mal was Du damit machen willst, dann kann man das möglicherweise leichter via Templates umsetzen.
-
Der Sinn darin ist übrigens, daß ich mir zu jeder Methode einen Satz Konstanten definieren möchte, die den Verlauf der Methode steuern. Dabei sollen die Konstanten für die verschiedenen Methoden nicht verwechselt werden können. Momentan kann man aber halt schlicht alle verwenden, da sie implizit auf bool gecasted werden.
Für sowas nimmt man normalerweise enums.
enum FooOption { FooOptionOff, FooOptionOn }; enum BarOption { BarOptionOff, BarOptionOn }; void Baz(FooOption fo); void Blubb(BarOption bo);
-
Hallo,
vielen Dank für Eure Antworten!
@hustenbär:
Perfekt, damit konnte ich mein Ziel erreichen. Ich hatte es anfangs zwar schon mal so probiert, aber dabei muß ich mich zu dumm angestellt haben.@camper:
Danke für die ausführliche Erläuterung. Dein Lösungsansatz ist sicher mächtig, allerdings habe ich hustenbärs vorgezogen, da er einfacher ist und für den vorliegenden Fall ausreichend. Und sorry für meinen Benutzernamen.
@~john:
Was ich damit machen wollte ist, nochmal knapp erklärt, daß in hustenbärs Beispiel der Methode Blubb(BarOption) keine Konstante vom Typ FooOption übergeben werden kann, um Verwechslungen seitens des Benutzers auszuschließen. Daß es mit typedef nicht geht, hatte ich zwar vermutet, aber es halt einfach mal probiert.Gruß
stroustrup