让我们假设我想定义一个结构,该结构可以看作是2D数组,但也可以为数组的内容提供类似于成员的访问器。
例如,可以编写一个Point2D
结构,该结构本质上是一个数组,但也可以提供x和y 成员(而不是访问器)。这样的结构可以充当不同库之间的桥梁:我与一些库一起工作,这些库将点视为具有x y成员,而另一些库则将其视为数组。
地精:https://godbolt.org/z/4H-gae
#include <array>
#include <cassert>
struct Point2D : public std::array<double, 2>
{
using Base = std::array<double, 2>;
Point2D(Base && v) :
Base(v),
x(operator[](0)),
y(operator[](1))
{}
double &x, &y;
};
void test()
{
Point2D p({1., 2.});
assert(p.x == 2.);
p.x += 4.;
assert(p.x == 5.);
}
这样的用例合理吗,还是我要求被各种UB反复射击?
如果这样的方法合理,有没有办法使构造函数constexpr?