C ++,非模板类中的模板变量

时间:2010-12-21 16:38:08

标签: c++ templates

我使用以下模板类:

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

如果我想创建一个对象Line,则需要写出Line的点类型和类型

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

我发现它毫无意义......如果点数是双倍的,那么Line也必须加倍......是否有可能只对类Line中的指针进行模板化并且不要对所有类进行模板化,就像那样

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

1 个答案:

答案 0 :(得分:6)

不直接。您可以在make_line的行中创建一个函数std::make_pair,该函数根据输入类型隐式计算返回类型,但其返回类型仍为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));
     ...
}