Origin -常量或新类型

Origin - constant or new type?

本文关键字:类型 新类型 常量 Origin      更新时间:2023-10-16

我正在编写一个Point类(在3d空间中),并且一直想知道创建原点的最佳方法是什么。下面是基本类(取自Andy的例子,以防有人想知道基本实现是什么):

struct Point
{
    constexpr Point(double x_, double y_, double z_) : x(x_), y(y_), z(z_) { }
    double x;
    double y;
    double z;
};
获得原点的第一种方法是定义一个constexpr变量:
constexpr Point origin = { 0.0, 0.0, 0.0 };

第二种方法是定义一个新的类型和重载算法,如果它们在计算原点时可以从优化中获益(假设我为Point编写了一个constexpr构造函数):

struct Origin: public Point
{
    constexpr Origin():
        Point(0.0, 0.0, 0.0)
    {}
};
constexpr Origin origin;

虽然第一种方法似乎更简单,更不容易出错,但我想知道第二种方法是否看起来是个好主意,是否有一些我没有看到的缺陷。

EDIT:想到参考库,我注意到CGAL使用了这样的东西:

class Origin {};
const Origin ORIGIN;

虽然第一种方法似乎更简单,更不容易出错,但我想知道第二种方法是否看起来是个好主意,是否有一些我没有看到的缺陷。

我认为基于继承的设计在概念上是有缺陷的:你不想在这里引入一个新的类型,并且起源在概念上是Point类的实例(一个非常特殊的实例,但仍然是一个实例),而不是该类型的专门化。

我宁愿在这里添加一个名为origin()的静态constexpr成员函数:

struct Point
{
    constexpr Point(double x_, double y_, double z_) : x(x_), y(y_), z(z_) { }
    constexpr static Point origin() { return {0, 0, 0}; }
    double x;
    double y;
    double z;
};

你可以这样使用:

int main()
{
    constexpr Point o = Point::origin();
}

或者,您可以添加名为originPoint类型的静态数据成员,而不是拥有名为origin()的静态函数。选择哪一个主要是品位问题