是否值得使用模板编写代表1D,2D,3D点的类
template <class T>
class Point2D
{
protected:
T X, Y;
public:
Point2D(const T x, const T y) : hot smileyx), Y(y)) {}
...
};
template <class T>
class Point3D : public Point2D<T>
{
protected:
T Z;
public:
Point3D(const T x, const T y, const T z) : Point2D<T>(x,y), Z(z) {}
...
};
Run Code Online (Sandbox Code Playgroud)
......或使用这种方法:
class Point2D
{
protected:
double X, Y;
public:
Point2D(const double x, const double y) : X(x), Y(y)) {}
...
};
class Point3D : public Point2D
{
protected:
double Z;
public:
Point3D(const double x, const double y, const double z) : Point2D(x,y), Z(z) {}
...
};
Run Code Online (Sandbox Code Playgroud)
我们将坐标理解为连续变量,因此使用double值表达它们是有意义的.使用矩阵时会出现类似的情况.但是在这种情况下,模板被广泛使用......
这个课程不仅供一次性使用,而且还是图书馆的一部分......我的第二部分是问题.如何实施一些"措施"功能?
template <class T>
T getDist(const Point2D <T> * p1, const Point2D<T> *p2)
{
....
}
Run Code Online (Sandbox Code Playgroud)
要么
double getDist(const Point2D <T> * p1, const Point2D<T> *p2)
{
....
}
Run Code Online (Sandbox Code Playgroud)
一般地或某些特定类型写这样的函数是否合理?
为什么重复自己?这些类和函数的大部分内容都是相同的.
像这样的东西效果更好:
template <std::size_T N, typename T>
class Point
{
public:
Point()
{
std::fill_n(mData, N, T());
}
explicit Point(const T& pX) :
mData[0](pX)
{
// or some variant (enable_if also works)
static_assert(N == 1, "X constructor only usable in 1D");
}
explicit Point(const T& pX, const T& pY) :
mData[0](pX),
mData[1](pY),
{
static_assert(N == 2, "XY constructor only usable in 2D");
}
// incomplete, left as exercise for reader. :P
private:
T mData[N];
};
Run Code Online (Sandbox Code Playgroud)
你只需要使用循环来实现这些功能:
template <std::size_T N, typename T>
T getDist(const Point<N, T>& pFirst, const Point<N, T>& pSecond)
{
// generic, compiler will unroll loops
}
Run Code Online (Sandbox Code Playgroud)