Jeh*_*han 4 c++ geometry c++11
我正在编写一个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;
};
Run Code Online (Sandbox Code Playgroud)
拥有原点的第一种方法是定义一个constexpr变量:
constexpr Point origin = { 0.0, 0.0, 0.0 };
Run Code Online (Sandbox Code Playgroud)
第二个是定义一个新类型和重载算法,如果用原点计算它们可以从优化中受益(让我们假设我写了一个constexpr构造函数Point):
struct Origin: public Point
{
constexpr Origin():
Point(0.0, 0.0, 0.0)
{}
};
constexpr Origin origin;
Run Code Online (Sandbox Code Playgroud)
虽然第一种方法似乎更简单,更不容易出错,但我想知道第二种方法是否是一个好主意,是否有一些我没有看到的陷阱.
编辑:考虑参考库,我注意到CGAL使用了类似的东西:
class Origin {};
const Origin ORIGIN;
Run Code Online (Sandbox Code Playgroud)
虽然第一种方法似乎更简单,更不容易出错,但我想知道第二种方法是否是一个好主意,是否有一些我没有看到的陷阱.
我认为基于继承的设计在概念上存在缺陷:你不想在这里引入一个新类型,并且原点在概念上是类的一个实例(一个非常特殊的实例,但仍然是一个实例)Point,而不是该类型的特化.
我宁愿添加一个constexpr名为origin()here 的静态成员函数:
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;
};
Run Code Online (Sandbox Code Playgroud)
然后你可以这样使用:
int main()
{
constexpr Point o = Point::origin();
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以添加一个Point被调用类型的静态数据成员,origin而不是调用静态函数origin().选择哪一个主要是品味问题.