2 回答
你应该说:
std::map<std::string, std::shared_ptr<sf::Texture>> resources;
// ^^^ "const" is redundant
// ...
resources.insert(std::make_pair("1", std::make_shared<sf::Texture>(tempResource)));
如果您的平台支持它,您甚至可以说:
resources.emplace("1", std::make_shared<sf::Texture>(tempResource));
或者:
resources.emplace("1", new sf::Texture(tempResource));
但这不如make_shared
, 效率更高,而且它违反了永远不要使用的规则new
。无论哪种方式,重点emplace
是它允许显式构造函数,不像insert
.
更好的是,根本不使用临时:
resources.emplace("1", std::make_shared<sf::Texture>()).second->loadFromFile("1.PNG");
您要做的是shared_ptr
从以前非托管的内存中创建一个。dynamic_pointer_cast
不是工作的工具。相反,这应该有效:
resources.insert(std::pair<const std::string, std::shared_ptr<sf::Texture>>("1", std::shared_ptr<sf::Texture>(new sf::Texture(tempResource)));
//or:
resources.insert(std::make_pair("1", std::shared_ptr<sf::Texture>(new sf::Texture(tempResource)));
然而shared_ptr
,从新分配的内存构造一个有点浪费。因为这会进行两次分配(一个用于内存,一个用于内部数据shared_ptr
)。如果你使用std::make_shared(tempResource)
这两个分配可以组合成一个更高的效率。
C++11 也允许resources.emplace("1", std::make_shared(tempResource)
就地构造该对,但上次我检查编译器对它的支持有些欠缺。
作为旁注:如果您不再需要tempResource
,您可能需要考虑移动(而不是通过使用std::move(tempResource)
而不是tempResource
构造新分配的对象将其复制到数据结构中。取决于sf::texture
此可能(或可能不)的实现效率更高。如果对象不是真正可移动构造的(因此移动构造与副本基本相同),您可能希望Texture
直接将其构造为 ashared_ptr
并在该对象上调用 load:
auto tempResource = std::make_shared<sf::Texture>();
tempResource->loadFromFile("1.PNG");
resources.emplace("1",std::move(tempResource));//or insert if emplace isn't availible