У меня есть std::map
, где ключ std::shared_ptr<Foo>
, а значение std::unique_ptr<Bar>
, где Foo
и Bar
очень разные классы из сторонней библиотеки.Я использую этот объект std::map
в качестве кэша в памяти.
Мне интересно, каким будет лучший способ вставки новой записи в эту карту, а затем возвращен из метода, учитывая, что Bar
переданный в std::unique_ptr
уже будет построен?
В настоящее время у меня есть следующее:
class SomeClass
{
public:
const Bar* TryGetBarValue(std::shared_ptr<Foo> foo)
{
auto it = _cache.find(foo);
if(it == _cache.end())
{
Bar bar = ThirdPartLibrary::CreateBar();
_cache.emplace(foo, std::make_unique<Bar>(bar));
return _cache.rbegin()->second.get();
}
//return result as raw ptr from unique_ptr
return it->second.get();
}
private:
std::map<std::shared_ptr<Foo>, std::unique_ptr<Bar>> _cache;
}
РЕДАКТИРОВАТЬ
Благодаря ответупредоставленный Квентином, теперь это моя реализация:
class SomeClass
{
public:
const Bar* TryGetBarValue(std::shared_ptr<Foo> foo)
{
auto it = _cachedImages.find(texture);
if (it != _cachedImages.end())
{
return it->second.get();
}
return _cachedImages.emplace(
std::move(texture),
std::make_unique<sf::Image>(texture->copyToImage())
).first->second.get();
}
private:
std::map<std::shared_ptr<Foo>, std::unique_ptr<Bar>> _cache;
}
Спасибо за вашу помощь!