見出しがあまり混乱しないことを願っています。私が持っているのは、StorageManager
から派生したクラスのオブジェクトのリストを含むクラスStorage
です。これが例です。
struct Storage {}; // abstract
class StorageManager
{
private:
map<string, unique_ptr<Storage>> List; // store all types of storage
public:
template <typename T>
void Add(string Name) // add new storage with name
{
List.insert(make_pair(Name, unique_ptr<Storage>(new T())));
}
Storage* Get(string Name) // get storage by name
{
return List[Name].get();
}
};
SayPosition
は特殊なストレージタイプです。
struct Position : public Storage
{
int X;
int Y;
};
私の最後の質問に対する素晴らしい答えのおかげで、このAdd
関数はすでに機能しています。改善したいのはGet
機能です。Storage*
次のように使用できるポインタを返すのが妥当です。
int main()
{
StorageManager Manager;
Manager.Add<Position>("pos"); // add a new storage of type position
auto Strge = Manager.Get("pos"); // get pointer to base class storage
auto Pstn = (Position*)Strge; // convert pointer to derived class position
Pstn->X = 5;
Pstn->Y = 42;
}
派生クラスへのポインタを自動的に返すことで、このポインタキャストを取り除く方法はありますか?たぶんテンプレートを使用していますか?