Фон
Я бы хотел, чтобы фасады применялись по отдельности, а не запекали их в самом классе. Но мне нужно работать с данными, поэтому мне нужно, чтобы this
был доступен с фасада. Вот небольшой пример:
#include <array>
#include <iostream>
template <typename T>
struct x_getter
{
friend T;
double x() const
{
return (*real_self)[0];
}
void x(double new_x)
{
(*real_self)[0] = new_x;
}
private:
T* real_self = reinterpret_cast<T*>(this);
x_getter() = default; //prevents accidental creation
};
struct coordinates : std::array<double, 3>, x_getter<coordinates>
{
using std::array<double, 3>::array;
};
int main()
{
coordinates origin{};
std::cout << origin.x();
origin.x(12.7);
std::cout << ' ' << origin.x() << '\n';
}
Это segfaults . Пользуясь чем-то похожим некоторое время назад, мне не повезло.
Вопрос
Как мне сделать this
с типом целевого класса доступным в классе фасада?
Мое понимание макета класса
Где-то внутри объекта, в неупорядоченном виде, есть массив и x_getter
. Используя reinterpret_cast
, я пытаюсь обмануть его, думая, что this
- это coordinates
, но когда он выполняет operator[]
, используемое смещение немного смещается, что выходит за пределы объекта, Таким образом, segfaulting.