私はstd::vector
という基底とstd::initializer_list<Attribute*>
という1つの基底を持っていますが、それはAttribute
クラスの派生クラスからなる関数の引数です。 l
の要素の型がl
の一つとbaseList
でその値を更新し、baseList
の1に等しい場合既存の型を置き換え、新しい型を追加する
updateBaseList
がしなければならない何
class Attribute {};
class Place : public Attribute {};
class Time : public Attribute {};
class Way: public Attribute {};
Place* place = new Place();
Time* time = new Time();
Way* way = new Way();
Place* place2 = new Place(...);
Time* time2 = new Time(...);
auto baseList = std::vector<Attribute*>({ place, time, way })
void updateBaseList(std::vector<Attribute*>& v, std::initializer_list<Attribute*> l);
は、あります。タイプがbaseList
で見つからない場合は、そのタイプに追加する必要があります。
検索対象の型がAttribute*
ではなく、派生クラスであることに注意してください。
私の試み
void updateBaseList(std::vector<Attribute*>& v, std::initializer_list<Attribute*> l) {
bool found;
for (auto listIt = l.begin(); listIt != l.end(); ++listIt) {
found = false;
for (auto attrIt = baseList.begin(); attrIt != baseList.end(); ++attrIt) {
if (typeid(**listIt) == typeid(**attrIt)) {
*attrIt = *listIt;
found = true;
break;
}
}
if (!found) {
baseList.push_back(*listIt);
}
}
}
しかしtypeid(**listIt)
とtypeid(**attrIt)
常にBase
を返します。私はupdateBaseList(baseList, { time2, place2 })
を呼び出す場合
目標
baseListあなたはクラス階層の多型を作成する必要があり{ place2, time2, way }