Typen checken?
-
Helium schrieb:
Warum unsinnig? Mach foo static
Wollte ich eigentlich auch
Achso, hab mir eigentlich auch gedacht, dass es ein vertippsler war
mfg
v R
-
CMatt schrieb:
1. für das was du da vor hast, wurden template-spezialisierung erfunden.
2. Du kannst die typen über die RTTI checken (muss allerdings beim compilieren an sein - beim VC++ ist es der parameter /CR )
bsp:template<class irgendwas> void foo (irgendwas value) { if (typeid( irgendwas ) == typeid(float)) { glVector3f (1.0f, 1.0f, 1.0f); } else if (typeid( irgendwas ) == typeid(double)) { glVector3d (1.0, 1.0, 1.0); } else if (typeid( irgendwas ) == typeid(unsigned int)) { glVector3ui (1, 1, 1); } // usw. }
Hi,
danke den code find ich von all den vorgeschlagenen am einfachsten zu handhaben
Oder gehts noch besser jedoch bei selbem handling?
Also die funktion sollte so benutzt werden:
float x=1.0f; foo (x);
Dabei soll dann in der funktion der wert an die jeweiligen funktionen übergeben werden.
-
*** schrieb:
Also die funktion sollte so benutzt werden:
float x=1.0f; foo (x);
Dabei soll dann in der funktion der wert an die jeweiligen funktionen übergeben werden.
in diesem Fall passt am besten function overloading, wie ich shon schrieb
-
Ich kann aber nicht für jede meiner 40 mathestrukturen 10 überladene funktionen machen für 100 Operatoren! (würde 1.000 Funktionen machen!)
-
Ich kann aber nicht für jede meiner 40 mathestrukturen 10 überladene funktionen machen für 100 Operatoren! (würde 1.000 Funktionen machen!)
40*10*100=1000??? eher 40000.
Aber 40000 if-Zweige sind in Ordnung? Sicher, das da nicht ein prinzipfehler hintersteckt.Und überleg mal.
Ist es so wirklich übersichtlicher:tempalte <typename T> void foo (T value) { if (typeid(T) == typeid(float)) { glVector3f (value, value, value); } else if (typeid(T) == typeid(double)) { glVector3d (value, value, value); } else if (typeid(T) == typeid(unsigned int)) { glVector3ui (value, value, value); } // usw. }
Als so:
void foo (float value) { glVector3f (value, value, value); } void foo (double value) { glVector3d (value, value, value); } void foo (unsigned int value) { glVector3ui (value, value, value); }
Also auf jeden Fall ist die Variante mit dem Überladen deutlich kürzer und zudem wird garantiert zur Compilezeit entschieden, welche Version benötigt wird.
Ich mein ja nur gl... hört sich so an, als ob Geschwindigkeit eine Rolle spielen könnte.
-
[quote="ssm"]
Shlo schrieb:
Helium schrieb:
1. Spezialisieren kannst du nur Klassen.
IMHO eine falsche Meinung, die keine Begründung hat
Funktionstemplates kann man explizit nicht aber partiell spezialisieren.
Das ist ok und eine explizite Spezialisierung:
template <class T> void foo(T t); template <> void foo(int);
Das ist auch ok aber *keine* partielle Spezialisierung sondern eine
Überladung, hier haben wir jetzt zwei Base-Templates:template<class T, class U> void foo1(T, U) { } template<class T> void foo1(T, unsigned) { }
Der feine Unterschied zwischen Ünerladung und Spezialisierung wird hier sehr schön erlärt:
http://www.gotw.ca/publications/mill17.htm
-
to HumeSikkins
es ging nich um partielle Spezialisierung
-
ssm schrieb:
to HumeSikkins
es ging nich um partielle Spezialisierung
Das Zitat sowie mein Beitrag sollten ausdrücken, dass ihr beide auf gewisse Art und Weise recht habt. Das Wort "spezialisieren" ist hier einfach nicht "speziell" genug
-
HumeSikkins schrieb:
ssm schrieb:
to HumeSikkins
es ging nich um partielle Spezialisierung
Das Zitat sowie mein Beitrag sollten ausdrücken, dass ihr beide auf gewisse Art und Weise recht habt. Das Wort "spezialisieren" ist hier einfach nicht "speziell" genug
1. Spezialisierung ist Spezialisierung
2. partielle Spezialisierung ist partielle Spezialisierung
3. es gibt keinen Begriff "die ganze Spezialisierung", oder doch?
-
ssm schrieb:
HumeSikkins schrieb:
ssm schrieb:
to HumeSikkins
es ging nich um partielle Spezialisierung
Das Zitat sowie mein Beitrag sollten ausdrücken, dass ihr beide auf gewisse Art und Weise recht habt. Das Wort "spezialisieren" ist hier einfach nicht "speziell" genug
1. Spezialisierung ist Spezialisierung
Nö. Spezialisierung ist das Ergebnis der Ersetzung von Template-Parametern durch tatsächliche Argumente und als solche kein eindeutiger Begriff. Eine Spezialisierung kann so z.B. durch eine Instanziierung oder durch eine explizite Spezialisierung entstehen. Sie ist aber keine explizite Spezialisierung.
2. partielle Spezialisierung ist partielle Spezialisierung
und nur für Template-Klassen möglich. Das Ergebnis ist eine alternative Definition eines primary Templates, die nach wie vor von mindestens einem Templateparameter abhängt.
3. es gibt keinen Begriff "die ganze Spezialisierung", oder doch?
Keine Ahnung was du meinst. Es gibt eine explizite Spezialisierung (explicit specialization).
Eine explizite Spezialisierung ist ein Konstrukt, dass eine alternative Definition für ein sogenanntes primary Template deklariert oder definiert, so dass diese Definition nicht mehr von einem Templateparameter abhängt. Eine explizite Spezialisierung beginnt immer mit template <> und kann sowohl für Klassentemplates als auch für Funktionstemplates angegeben werden.
-
HumeSikkins schrieb:
ssm schrieb:
HumeSikkins schrieb:
ssm schrieb:
to HumeSikkins
es ging nich um partielle Spezialisierung
Das Zitat sowie mein Beitrag sollten ausdrücken, dass ihr beide auf gewisse Art und Weise recht habt. Das Wort "spezialisieren" ist hier einfach nicht "speziell" genug
1. Spezialisierung ist Spezialisierung
Nö. Spezialisierung ist das Ergebnis der Ersetzung von Template-Parametern durch tatsächliche Argumente und als solche kein eindeutiger Begriff. Eine Spezialisierung kann so z.B. durch eine Instanziierung oder durch eine explizite Spezialisierung entstehen. Sie ist aber keine explizite Spezialisierung.
2. partielle Spezialisierung ist partielle Spezialisierung
und nur für Template-Klassen möglich. Das Ergebnis ist eine alternative Definition eines primary Templates, die nach wie vor von mindestens einem Templateparameter abhängt.
3. es gibt keinen Begriff "die ganze Spezialisierung", oder doch?
Keine Ahnung was du meinst. Es gibt eine explizite Spezialisierung (explicit specialization).
Eine explizite Spezialisierung ist ein Konstrukt, dass eine alternative Definition für ein sogenanntes primary Template deklariert oder definiert, so dass diese Definition nicht mehr von einem Templateparameter abhängt. Eine explizite Spezialisierung beginnt immer mit template <> und kann sowohl für Klassentemplates als auch für Funktionstemplates angegeben werden.
ok, ok, ich kapitulire