002
03.02.2007, 22:47 Uhr
virtual
Sexiest Bit alive (Operator)
|
Du musst Dich zunächst entscheiden, ob Du einen Fehler zur Laufzeit oder zur Kompile-Zeit haben willst:
Wenn er zur Laufzeit sein soll, genügt im Constructor von Schuhschrank ein einfach ein dynamiccast<Schuh*>(schuh). Wenn dies fehl schlägt mit einer bad_cast exception, wurde ein Falscher Typ verwendet.
Wenn es zur Kompilezeit sein soll, dann kenne ich nur folgenden dirty-Hack:
C++: |
class Schuh { };
class HalbSchuh : public Schuh { };
class KeinSchuh { };
template<typename T> class Schuhschrank { typedef int checker[(int)dynamic_cast<Schuh*>((T*)1)]; };
int main() { // Schuhschrank<KeinSchuh> a; Schuhschrank<Schuh> b; Schuhschrank<HalbSchuh> c;
Schuh s;
}
|
Ich bin mir augenblicklich nicht sicher, ob das wirklich Portabel ist. Vermutlich nicht. Aber in diese Richtung kannst Du ja mal forschen.
Das dumme ist, daß der Kompiler eine unschöne Fehlermeldung wirft. Dh normalerweise solltest Du noch in der Zeile einen fetten Kommentar sdchreiben, warum denn hier ein Kompiler meckern könnte. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |