Templates und Typen



  • Hallo,

    ich arbeite gerade an einer Templateklasse für einen 2D-Vektor. Allerdings stellt sich mir eine Frage: Ich möchte eine Methode wie Length implementieren, die mir dann die Länge des Vektors zurückgibt. Aber dabei weiß ich nicht, welchen Typ ich zurückgeben soll! Es könnte ja sein, dass jemand einen Vektor<int> erstellt, aber einen float zurückhaben will, wenn er Length() aufruft. Außerdem wäre es nicht ungbedingt schön für jeden Typ eine Length-Funktion zu implementieren wie LengthFloat,LengthDouble usw.

    Und noch etwas anderes:
    Wie kann man ein typedef mit Templates erreichen?
    Also ein typedef Vektor Point
    geht nicht.



  • Ich würde dem Benutzer gar nicht die Möglichkeit geben, einen Vector<int> zu erstellen. Dann wäre es z.B. schwer einen Einheitsvektor erstellen...
    Ich würde den Vektor mit float oder double variablen belegen.
    und dementsprechend auch dann entweder float oder double bei length zurückgeben.



  • Das hier ist eine Methode:

    template <class U> Length(void)
    {
      U length=sqrt(x*x+y*y);
      return U;
    }
    

    Warum funktioniert dann eine Spezialisierung nicht?

    Vektor.Length<float>();
    


  • Hi du kannst doch eine template Methode(Memberfunktion) in die Template - Klasse einbauen! á la

    template<typename X> class Vector
      {
        template<typename Z>Z Length(){ }
      }
    

    damit kannst du dir das überladen sparen!



  • Original erstellt von <SlimTimmy>:
    Warum funktioniert dann eine Spezialisierung nicht?

    sie funktioniert 🙂 nur der VC++ kann es nicht, es gibt aber nen workaround:

    template<typename T>
    T foo(T* dummy=0)
    {
    return T();
    }

    mit dem dummy parameter kann es der VC++ auch 🙂



  • ok!
    Aber wie kann ich denn das mit dem typedef machen?



  • was willst du machen?

    typedef Vector Point;
    kann nicht gehen, da Vector ja kein echter Typ ist.
    aber

    typedef Vector<int> IntVector;
    geht einwandfrei...

    die obere version kann man nur simulieren:

    template<typename T> 
    class Point
    {
    public:
      typedef Vector<T> Type;
    };
    

    dann kannst du
    Point<int>::Type machen und hast nen Vector<T> 🙂


Anmelden zum Antworten