Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Template-Konstrukte

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.01.2010, 15:44 Uhr
banshee



Hallo,

ich habe zwei Fragen zu folgendem Code. Ich hoffe, ich habe nicht zu viel rausgelassen. Falls es keinen Sinn ergibt, bitte bescheid sagen
Zunächst einmal: Was bringt der Aufruf static_cast<int>(::sqrt(static_cast<float>(x))); in der Spezialisierung von VecHelper? Ist das nicht genau das, was der Compiler implizit mach, kann man sich das also nicht sparen und erzielt immer noch den gleichen Effekt?

Zweite Frage: Welchen Wert liefert die Dereferenzierung des this-Zeigers in der normalize() Funktion von Vec? Offensichtlich muss es ein Wert vom template-Typ T sein, aber wieso bzw. wo kommt der her?


C++:
template<typename T> struct VecHelper
{
    static T sqrt(T x)
    {
        return ::sqrt(x);
    }
};

template<> struct VecHelper<int>
{
    static int sqrt(int x)
    {
        return static_cast<int>(::sqrt(static_cast<float>(x)));
    }
};

template<typename T, int DIM> struct VecCoords
{
    T value[DIM];
};

template<typename T, int DIM> class Vec : public VecCoords<T, DIM>
{
public:
        T length() const
    {
        return VecHelper<T>::sqrt(lengthSq());
    }

    T lengthSq() const
    {
        T r = value[0] * value[0];
        for(int i = 1; i < DIM; i++)
            r += value[i] * value[i];
        return r;
    }

    Vec<T, DIM>& normalize()
    {
        return *this /= length();
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.01.2010, 18:08 Uhr
0xdeadbeef
Gott
(Operator)


Die Casts lassen in Verbindung mit der in C++ etwas merkwürdigen Schreibweise ::sqrt darauf schließen, dass der Autor des Codes noch auf die alte C-Bibliothek zurückgreift (und dabei übersieht, dass sqrt in C einen double erwartet). Vermutlich soll das eine Compilerwarnung auflösen.

Was die normalize-Methode in Vec angeht, nehme ich an, dass Vec oder VecCoords einen operator/= hat, der dort aufgerufen wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 18.01.2010 um 18:09 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.01.2010, 20:03 Uhr
banshee




Zitat von 0xdeadbeef:
Was die normalize-Methode in Vec angeht, nehme ich an, dass Vec oder VecCoords einen operator/= hat, der dort aufgerufen wird.


Ja, das ergibt Sinn. Da hätte ich auch selbst drauf kommen können.


Zitat von 0xdeadbeef:
Die Casts lassen in Verbindung mit der in C++ etwas merkwürdigen Schreibweise ::sqrt darauf schließen, dass der Autor des Codes noch auf die alte C-Bibliothek zurückgreift (und dabei übersieht, dass sqrt in C einen double erwartet). Vermutlich soll das eine Compilerwarnung auflösen.


Das verstehe ich noch nicht so ganz. ::sqrt soll ja anscheinend verhindern, dass die sqrt() aus VecHelper sich wieder selbst aufruft. Der Aufruf ::sqrt führt mich auch in die math.h. Gibt es denn in C++ eine neuere Mathelib? Ich dachte immer, auch da wird math.h bzw. cmath noch mitbenutzt?!
Wenn ich mit der Maus jedenfalls über den Aufruf fahre, kriege ich mehrere Varianten der Funktion angezeigt: float, double und long double. Wenn ich also ::sqrt mit einem int aufrufe, castet der Compiler doch sowieso implizit nach float und auch der Rückgabetyp wird wieder implizit nach int gecastet.
Wo wird da jetzt noch eine Warnung ausgelöst und vor allen Dingen, welchen Sinn hat das, sich im eigenen Code Warnungen zu schmeißen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2010, 20:22 Uhr
0xdeadbeef
Gott
(Operator)


::sqrt ist die alte C-Funktion mit der Signatur double sqrt(double) aus math.h. cmath deklariert mehrere Funktionen std::sqrt für float, double und long double.

So oder so, wenn der Rückgabewert ohne expliziten Cast in einen int gestopft wird, warnen die meisten Compiler.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: