shared ptr — возможно ли иметь дело с членом объединения в классе без флага, чтобы отслеживать, какая переменная в объединении будет использоваться?

У меня есть производный класс, в котором есть член объединения, в котором хранятся два умных указателя. Однако, когда я пытаюсь скопировать-инициализировать некоторые экземпляры этого класса, компилятор сообщает об ошибке, которую я имею в виду для удаленной функции. Так что я думаю, это потому, что у него есть переменная объединения, и поэтому компилятор не может сгенерировать конструктор копирования по умолчанию для класса.

объявление класса:

struct EndpointInfo : public IntersectInfo {
EndpointInfo() {}
EndpointInfo(const EndpointInfo &other) : _emitter(other._emitter),  {}

EndpointInfo(const std::shared_ptr<ProjectiveSensor> s, const Ray &ray) : IntersectInfo(ray._o), _sensor(s) {}
EndpointInfo(const std::shared_ptr<Emitter> e, const Ray &ray, const Vec3f &n_light) : IntersectInfo(ray._o), _emitter(e) {
_normal = n_light; // _normal is a member of base class.
}
~EndpointInfo() {}

union {
const std::shared_ptr<ProjectiveSensor> _sensor;
const std::shared_ptr<Emitter> _emitter;
};
};

В случае, если требуется объявление базового класса:

struct IntersectInfo {
Point3f _p;
Vec3f _wo;
float _t = INFINITY;
Vec3f _normal;
TransportMode _transport_mode;

std::shared_ptr<Primitive> _primitive;
std::shared_ptr<BSDF> _bsdf;
struct {
Vec3f _n;
Vec3f _tangent;
Vec3f _bitangent;
} _shading;
Vec3f _dpdu, _dpdv;

IntersectInfo() = default;
IntersectInfo(const IntersectInfo &origin);
IntersectInfo(const Point3f p);

};

Итак, из приведенного выше кода, базовый класс IntersectInfo уже обладает конструктором копирования, и я думаю, что все, что меня волнует, это как скопировать объединение в конструкторе копирования EndpointInfo,

Мой вопрос, после того как я прочитал эта тема, Я думал, смогу ли я использовать что-то вроде memcpy, который не заботится о фактическом типе, но только о том, сколько памяти он копирует. И так как только std::shared_ptrs в союзе, и независимо от того, какой из них, _sensor или же _emitter Я хочу скопировать (в том же объеме памяти), я просто скопировать кусок памяти. Если бы я мог, могу ли я использовать:

EndpointInfo(const EndpointInfo &other) : _emitter(other._emitter),  {
// either
memcpy(&_sensor, &other._sensor, sizeof(_sensor));
// or
memcpy(&_emitter, &other._emitter, sizeof(_emitter));
// even
_sensor = other._sensor;
}

Если я не могу так использовать, есть ли другой способ, вместо того, чтобы явно использовать переменную для указания типа?

-2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector