Информация об изменениях

Сообщение Re[9]: placement new от 11.12.2022 17:50

Изменено 11.12.2022 17:51 Sm0ke

Re[9]: placement new
Здравствуйте, maks1180, Вы писали:

SP>>
SP>>std::variant<ClientCommon, Client1, Client2> v;
SP>>v = ClientCommon{};
SP>>v = Client1{std::move(std::get<ClientCommon>(v))};
SP>>


M>Идея хорошая, только я без std::move хотел обойтись. Если Client1 наследник от ClientCommon, то не нужно дедать std::move, так как он по тому же адресу должен лежать.

M>Или не так ?

1. Нет гарантий, что это так
2. Нет гарантий, что данные не будут перезатёрты

//
Можно хранить параметры отдельно, и добавить указатель на них в ClientCommon, если не хочешь их мувать.

//
Я понимаю, что ты хочешь досоздать Client1 из ClientCommon
Но тогда можно сделать pimpl.

struct ClientCommon;

struct ClientImpl { ClientCommon * m_outer; };
struct Client1 : ClientImpl {};
struct Client2 : ClientImpl {};

struct ClientCommon {
  // общие данные
  
  // реализация
  keep<ClientImpl, Client1, Client2> m_impl;
};
Re[9]: placement new
Здравствуйте, maks1180, Вы писали:

SP>>
SP>>std::variant<ClientCommon, Client1, Client2> v;
SP>>v = ClientCommon{};
SP>>v = Client1{std::move(std::get<ClientCommon>(v))};
SP>>


M>Идея хорошая, только я без std::move хотел обойтись. Если Client1 наследник от ClientCommon, то не нужно дедать std::move, так как он по тому же адресу должен лежать.

M>Или не так ?

1. Нет гарантий, что это так
2. Нет гарантий, что данные не будут перезатёрты

//
Можно хранить параметры отдельно, и добавить указатель на них в ClientCommon, если не хочешь их мувать.

//
Я понимаю, что ты хочешь досоздать Client1 из ClientCommon, а cpp этого нет.
Но тогда можно сделать pimpl.

struct ClientCommon;

struct ClientImpl { ClientCommon * m_outer; };
struct Client1 : ClientImpl {};
struct Client2 : ClientImpl {};

struct ClientCommon {
  // общие данные
  
  // реализация
  keep<ClientImpl, Client1, Client2> m_impl;
};