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
、新しく割り当てられたメモリから を構築するのはやや無駄です。これは 2 つの割り当て (メモリ用と の内部データ用shared_ptr
) を行うためです。これらの 2 つの割り当てを使用std::make_shared(tempResource)
すると、効率を高めるために 1 つにまとめることができます。
C++11 では、ペアのインプレース構築も許可resources.emplace("1", std::make_shared(tempResource)
されますが、前回、コンパイラのサポートを確認したところ、そのサポートがやや不足していました。
補足として、もう必要ない場合は、移動を検討することをお勧めします (代わりに、新しく割り当てられたオブジェクトを構築するために代わりにtempResource
使用してデータ構造にコピーするのではなく) 。オブジェクトが真に移動構築可能でない場合 (したがって、移動構築は基本的にコピーと同じです)、 を直接 に構築し、そのオブジェクトでload を呼び出すことをお勧めします。std::move(tempResource)
tempResource
sf::texture
Texture
shared_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