特定のオブジェクトを名前とタイプとともに保存するためのマップ コンテナーがあります。
typedef std::map<std::string, std::pair<ObjType, ObjBase*> > ObjContainer;
ただし、コードの多くの部分で、次のような構造があります。
ObjContainer::iterator it = mObjContainer.find(name);
if (it != mObjContainer.end()) {
if (it->second.second) {
it->second.second->setObj2Default();
delete it->second.second;
it->second.second = 0;
}
}
明らかに、多くの「it->second.second」はあまり明確ではなく、保守できません。将来変更された場合、たとえば、もう 1 つのフィールドをサポートするために、すべてが壊れます。したがって、次のように、フィールドにアクセスする関数によってそれらを変更しようとしています。
ObjBase*& getObjPtr(ObjContainer::iterator it) {
return it->second.second;
}
同様に、getObjName および getObjType も機能します。
また、イテレータがこれらのフィールドを返すようにするとより明確になることも示唆されました。
it.objPtr();
it.objName();
it.objType();
しかし、それらの機能を持たせるために STL イテレータを継承するべきではないと思いますよね? マップのラッパーを作成し、それらの関数を持つ独自のイテレータを用意する以外に、それを行う方法はありません。
では、最も適切な選択肢は何でしょうか? 私が見ていないこの問題を解決する他の方法はありますか?