Здравствуйте, 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;
}