gpt4 book ai didi

c++ - 使用 2D/3D 点模板

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:21 28 4
gpt4 key购买 nike

是否值得使用模板编写表示 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) {}
...
};

...或使用这种方法:

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

我们将坐标理解为连续变量,因此使用 double 值来表示它们是有意义的。使用矩阵时会出现类似的情况。然而在这种情况下,模板被广泛使用......

这个类不仅是单独使用的,而且它将成为库的一部分……还有我的问题的第二部分。一些“度量”功能应该如何实现?

template <class T>
T getDist(const Point2D <T> * p1, const Point2D<T> *p2)
{
....
}

double  getDist(const Point2D <T> * p1, const Point2D<T> *p2)
{
....
}

写这样的函数是通用的还是针对某个特定类型写的合理?

最佳答案

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

这样的东西效果更好:

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

你只需为函数使用循环:

template <std::size_T N, typename T>
T getDist(const Point<N, T>& pFirst, const Point<N, T>& pSecond)
{
// generic, compiler will unroll loops
}

关于c++ - 使用 2D/3D 点模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3937276/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com