我使用以下模板类:
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);
...
}
答案 0 :(得分:6)
不直接。您可以在make_line
的行中创建一个函数std::make_pair
,该函数根据输入类型隐式计算返回类型,但其返回类型仍为Line<double>
。如果您构建匿名Line
以传入另一个函数,这将非常有用。
在C ++ 0X中,auto
关键字用于根据指定表达式的类型声明隐式类型变量。
所以这可以做这样的事情(不改变你的Point2D
或Line
类):
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));
...
}