私は本当にひどく設計されたプロジェクトに取り組んでおり、このデータ構造に出くわしました:
class OldBagOfData
{
public:
std::vector< BaseClass* > baseDatas;
std::vector< Derived1* > derived1Datas;
std::vector< Derived2* > derived2Datas;
std::vector< Derived3* > derived3Datas;
std::vector< Derived4* > derived4Datas;
}
クラスを更新する方法は、非常に多くの if/else 条件 (数十) を使用しており、データを読み取るだけであるにもかかわらず、メンバーは変更可能です (さらに、インスタンスではなくポインターを使用しています)。
汎用関数とテンプレートを使用してコードを単純化しました。
class CurrentBagOfData
{
private:
std::vector< BaseClass* > genericContainer;
Template< typename DataType>
std::vector< DataType* > getData( datatype IDtype);
public:
std::vector< BaseClass* > getbaseDatas(); /* = getData<Base>("base") */
std::vector< Derived1* > getDerived1Datas(); /* = getData<Derived1>("derived1") */
std::vector< Derived2* > getDerived2Datas(); /* = getData<Derived2>("derived2") */
std::vector< Derived3* > getDerived3Datas(); /* = getData<Derived3>("derived3") */
std::vector< Derived4* > getDerived4Datas(); /* = getData<Derived4>("derived4") */
}
ただし、データを読み取って新しい入力をキューに入れるだけなので、 iterators を使用したいと思います:
// This loop is forbidden because obod.getDerived1Datas() is a temporary object
for( std::vector<Derived1*>::iterator it = obod.getDerived1Datas().begin();
it != obod.getDerived1Datas().end(); i++)
{
/* processing *it */
}
//What I want to do :
for( std::vector<Derived1*>::iteratorDerived1 it = obod.begin(); it != obod.end(); i++)
{
// it iterate over every Derived1 datas in the generic container
/* processing *it */
}
std::vector::iteratorDerivedX を作成するにはどうすればよいですか? 私のデザインに関するその他のアドバイスは大歓迎です。