C++ でジェネリック ストレージ クラスを作成しようとしています。次のコードを見ると、string
/のマップを保存AnyType
してアクセスしたいと考えています。
class StoresTestC
{
public:
template < class SettingsType >
std::map< std::string, SettingsType >* getStore(std::string const&);
private:
std::map< std::string, void* > stores_;
};
template < class SettingsType >
std::map< std::string, SettingsType >* StoresTestC::getStore(std::string const& name)
{
if (stores_.count(name) > 0)
{
void* temp = this->stores_[name];
return (std::map< std::string, SettingsType >*)(temp);
}
else
{
std::map< std::string, SettingsType > * result = new std::map< std::string, SettingsType > ();
this->stores_[name] = result;
return result;
}
}
そうすることには2つの明らかな危険があると思います。
間違って呼び出すと
SettingsType
/name
間違ったキャストを呼び出すと、私の知る限り(間違っている可能性があります)、未定義の動作につながります。メモリ リークが発生しますが、その解決策があります (ここで公開するのは 2 時間もかかりました)。
他に問題が発生する可能性があり、予測できることはありますか?