Origin -常量或新类型
Origin - constant or new type?
我正在编写一个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();
}
或者,您可以添加名为origin
的Point
类型的静态数据成员,而不是拥有名为origin()
的静态函数。选择哪一个主要是品位问题
相关文章:
- 有没有办法通过插入新类型名称而不是 int 来使用 2 位大小类型而不是 int?
- 在 C++17 中的每个实例化时生成一个新类型
- 使用 basic_string 声明新类型的字符串
- Visual C 新类型初始化
- C 通过Typedef定义新类型
- C 模板:返回新类型的正确方法
- 我如何将现有模板类部分分为新类型
- 每当C++调用函数时生成新类型
- 是否可以使用元编程将类型列表转换为对列表中每种类型具有特定隐式转换行为的新类型?
- 应替换现有类型,向其添加新类型
- C++,指向作为新类型的函数的指针
- 定义一个新类型并重载其运算符
- 在python中动态创建一个新类型
- 如何从模板类中的类型名传递创建新类型名
- 在函数返回值中定义一个新类型
- 如何在 MPI 中创建新类型
- 为什么要将变量类型 p 声明为新类型,而不是将其声明为类型 p
- C++使用类来定义新类型
- 用C++中的typedef来总结和定义一个具有两个函数的新类型
- 将新类型作为参数发送