c ++: наследовать std :: array и хранить ссылку на внутренние значения - PullRequest
0 голосов
/ 09 февраля 2019

Давайте предположим, что я хотел бы определить структуру, которую можно рассматривать как двумерный массив, но который также предоставляет элементы, подобные элементам доступа к содержимому массива.

Например, можно написать 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?

...