2010-12-21 169 views
4

我使用下面的模板類:C++中,非模板類模板變量

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; 
    .... 
}; 

如果我想創建一個對象行,就必須寫

線的點和類型的類型
int main 
{ 
    Point2DC<double> p1(0,0); 
    Point2DC<double> p2(10,10); 
    Line<double> l(&p1,&p2); 
    ... 
} 

我覺得毫無意義......如果點是雙,所以線也必須加倍...是否有可能只模板化指針類線和不模板化所有類,像

東西
template <class T> 
class Point2D; 

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

,並使用

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

如何模板類Point2DC界定? – 2010-12-21 16:45:31

+0

有一個錯誤,我修好了。 – MMS 2010-12-21 17:17:45

回答

6
直接

沒有。您可以沿着std::make_pair的行生成函數make_line,該函數根據輸入類型隱式計算返回類型,但其返回類型仍將爲Line<double>。如果您構建匿名Line以傳遞到另一個函數,這非常有用。

在C++ 0X中,auto關鍵字的新用法用於基於指定表達式的類型聲明隱式類型變量。

因此,這將允許做這樣的事情(不改變你的Point2DLine類):

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)); 
    ... 
}