使用2D/3D点模板

0 c++ templates

是否值得使用模板编写代表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)

一般地或某些特定类型写这样的函数是否合理?

GMa*_*ckG 6

为什么重复自己?这些类和函数的大部分内容都是相同的.

像这样的东西效果更好:

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)

  • 怎么样`std :: array <T,N> mData;`? (2认同)