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

Сообщение Re[2]: другой Вопрос по стандартному unique_ptr от 19.07.2023 12:01

Изменено 19.07.2023 12:02 Sm0ke

Re[2]: другой Вопрос по стандартному unique_ptr
Здравствуйте, vopl, Вы писали:

V>Можно подменить аргумент для конструктора — передавать туда не сам объект-к-хранению, с тем чтобы впоследствии его двинуть/скопировать в map-node или выкинуть если ключ уже есть, а передавать некую фабрику, которую map активирует только если действительно нужно будет построить новый node. Примерно так:


V>
V>#include <map>
V>#include <memory>
V>#include <iostream>

V>int main()
V>{
V>    std::map<int, std::unique_ptr<int>> map;

V>    struct Maker
V>    {
V>        operator std::unique_ptr<int>()
V>        {
V>            std::cout << "Maker activated" << std::endl;
V>            return std::make_unique<int>(220);
V>        }
V>    };

V>    map.try_emplace(1, Maker{});
V>    map.try_emplace(1, Maker{});

V>    return 0;
V>}
V>


В мейкер придётся ещё передавать параметры создания объекта, и в нём хранить. Но в целом идея ясна, спасибо
Re[2]: другой Вопрос по стандартному unique_ptr
Здравствуйте, vopl, Вы писали:

V>Можно подменить аргумент для конструктора — передавать туда не сам объект-к-хранению, с тем чтобы впоследствии его двинуть/скопировать в map-node или выкинуть если ключ уже есть, а передавать некую фабрику, которую map активирует только если действительно нужно будет построить новый node. Примерно так:


V>
V>#include <map>
V>#include <memory>
V>#include <iostream>

V>int main()
V>{
V>    std::map<int, std::unique_ptr<int>> map;

V>    struct Maker
V>    {
V>        operator std::unique_ptr<int>()
V>        {
V>            std::cout << "Maker activated" << std::endl;
V>            return std::make_unique<int>(220);
V>        }
V>    };

V>    map.try_emplace(1, Maker{});
V>    map.try_emplace(1, Maker{});

V>    return 0;
V>}
V>


В мейкер придётся ещё передавать параметры создания объекта, и в нём хранить. Но в целом идея ясна, спасибо
upd: Хотя выглядит как костыль)