Re: другой Вопрос по стандартному unique_ptr
От: vopl Россия  
Дата: 18.07.23 14:28
Оценка: 23 (4)
Здравствуйте, Sm0ke, Вы писали:

S>У меня другой вопрос по unique_ptr


S>Если взять в него завернуть некий some_type

S>А сам умный указатель положить в map
S>То при v_map.try_emplace(v_key, std::make_unique<some_type>() ); Будет создан экземляр, даже если в мапе есть запись с тем-же ключом.
S>Т.е будет создан и разрушен лишний раз unique_ptr со своим динамическим экземпляром some_type

S>Вот если бы у unique_ptr был конструктор по принципу std::in_place_type, то этого оверхеда можно было избежать!


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

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

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

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

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

    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.