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、新しく割り当てられたメモリから を構築するのはやや無駄です。これは 2 つの割り当て (メモリ用と の内部データ用shared_ptr) を行うためです。これらの 2 つの割り当てを使用std::make_shared(tempResource)すると、効率を高めるために 1 つにまとめることができます。

C++11 では、ペアのインプレース構築も許可resources.emplace("1", std::make_shared(tempResource)されますが、前回、コンパイラのサポートを確認したところ、そのサポートがやや不足していました。

補足として、もう必要ない場合は、移動を検討することをお勧めします (代わりに、新しく割り当てられたオブジェクトを構築するために代わりにtempResource使用してデータ構造にコピーするのではなく) 。オブジェクトが真に移動構築可能でない場合 (したがって、移動構築は基本的にコピーと同じです)、 を直接 に構築し、そのオブジェクトでload を呼び出すことをお勧めします。std::move(tempResource)tempResourcesf::textureTextureshared_ptr

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 に答える