Давайте предположим, что я хотел бы определить структуру, которую можно рассматривать как двумерный массив, но который также предоставляет элементы, подобные элементам доступа к содержимому массива.
Например, можно написать Point2D
struct, которая обязательно будет массивом, но также обеспечит x и y членов (не методы доступа).Такая структура может служить мостом между различными библиотеками: я работаю с некоторыми библиотеками, которые рассматривают точку как имеющую члены xay, и некоторые другие, которые рассматривают ее как массив.
Godbolt: 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?