1
4

2 回答 2

0

你应该说:

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");
于 2012-12-09T12:44:44.833 回答
0

您要做的是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
于 2012-12-09T12:44:55.710 回答