Сообщение Re[9]: placement new от 11.12.2022 17:50
Изменено 11.12.2022 17:51 Sm0ke
Re[9]: placement new
Здравствуйте, maks1180, Вы писали:
SP>>
M>Идея хорошая, только я без std::move хотел обойтись. Если Client1 наследник от ClientCommon, то не нужно дедать std::move, так как он по тому же адресу должен лежать.
M>Или не так ?
1. Нет гарантий, что это так
2. Нет гарантий, что данные не будут перезатёрты
//
Можно хранить параметры отдельно, и добавить указатель на них в ClientCommon, если не хочешь их мувать.
//
Я понимаю, что ты хочешь досоздать Client1 из ClientCommon
Но тогда можно сделать pimpl.
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>>
M>Идея хорошая, только я без std::move хотел обойтись. Если Client1 наследник от ClientCommon, то не нужно дедать std::move, так как он по тому же адресу должен лежать.
M>Или не так ?
1. Нет гарантий, что это так
2. Нет гарантий, что данные не будут перезатёрты
//
Можно хранить параметры отдельно, и добавить указатель на них в ClientCommon, если не хочешь их мувать.
//
Я понимаю, что ты хочешь досоздать Client1 из ClientCommon, а cpp этого нет.
Но тогда можно сделать pimpl.
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;
};