2010-12-21 16 views
4

ich folgende Template-Klassen verwende:C++, Template-Variable in nicht Template-Klasse

template <class T> 
class Point2D 
{ 
    private: 
      T x; 
      T y; 
... 
}; 

template <class T> 
class Point2D; 

template <class T> 
class Line{ 
    private: 
      Point2D <T> *start; 
      Point2D <T> *start; 
    .... 
}; 

Wenn ich ein Objekt Linie erstellen möchten, ist es notwendig Typ des Punktes und Art der Linie

zu schreiben
int main 
{ 
    Point2DC<double> p1(0,0); 
    Point2DC<double> p2(10,10); 
    Line<double> l(&p1,&p2); 
    ... 
} 

ich finde es ziemlich sinnlos ... Wenn die Punkte doppelt sind, so Linie muss auch doppelt so hoch sein ... Ist es möglich, nur Zeiger in der Klasse Line templatize und tun templatize nicht alle Klasse, etwas wie das

template <class T> 
class Point2D; 

class Line{ 
    private: 
      template <class T> 
      Point2D <T> *start; 
      Point2D <T> *start; 
    .... 
}; 

und verwenden

int main 
{ 
    Point2D<double> p1(0,0); 
    Point2D<double> p2(10,10); 
    Line l(&p1,&p2); 
    ... 
} 
+0

Wie Template-Klasse Point2DC definiert ist? –

+0

Es gab einen Fehler, ich habe es behoben. – MMS

Antwort

6

Nicht direkt. Sie können eine Funktion make_line in den Zeilen std::make_pair machen, die implizit den Rückgabetyp basierend auf den Eingabetypen ermittelt, dessen Rückgabetyp jedoch weiterhin Line<double> lautet. Dies ist nützlich, wenn Sie einen anonymen Line für den Übergang in eine andere Funktion erstellen.

In C++ 0X gibt es eine neue Verwendung des Schlüsselworts zum Deklarieren einer implizit typisierten Variablen, basierend auf dem Typ des zugewiesenen Ausdrucks.

So würde dies erlauben, so etwas zu tun (ohne Ihre Point2D oder Line Klassen zu ändern):

template <class T> 
Line<T> make_line(Point2D<T> *p1, Point2D<T> *p2) 
{ 
    return Line<T> (p1, p2); 
} 

template <class T> 
void DoSomethingWithALine(const Line<T> &l) 
{ 
    .... 
} 

int main 
{ 
    Point2DC<double> p1(0,0); 
    Point2DC<double> p2(10,10); 
    // C++0X only: 
    auto l = make_line(&p1,&p2); 

    // Current C++: 
    DoSomethingWithALine(make_line(&p1, &p2)); 
    ... 
} 
+1

Vielleicht möchten Sie auch sehen, wie Sie Point2D und Line verwenden - es gibt keinen Grund, sie zu Templates zu machen, wenn Sie sie nur mit Double verwenden. Sie könnten sich zu sehr verallgemeinern und die Dinge schwieriger machen, als sie sein müssten. – Eclipse

+0

Kurzes Beispiel könnte hilfreich sein. Vielen Dank. – MMS

+0

Ein kurzes Beispiel für was? – Eclipse