2010-12-21 224 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)); 
    ... 
}