您需要使类层次结构具有多态性。执行此操作的一个好方法是添加virtual ~Attribute() { }
析构函数:
struct Attribute
{
virtual ~Attribute() { }
};
那么你的代码按预期工作 http://melpon.org/wandbox/permlink/FLTo8aQ4RRk5Y6pp:
{
auto baseList = std::vector<Attribute*>({ place0, time0 });
updateBaseList(baseList, {place2, time2, way0});
assert(baseList[0] == place2);
assert(baseList[1] == time2);
assert(baseList[2] == way0);
assert(baseList.size() == 3);
updateBaseList(baseList, {place0});
assert(baseList[0] == place0);
assert(baseList[1] == time2);
assert(baseList[2] == way0);
assert(baseList.size() == 3);
}
不相关,但您可以实施baseList
使用 C++11 range-for 循环更容易阅读:
void updateBaseList(std::vector<Attribute*>& v, std::initializer_list<Attribute*> l)
{
for (auto& litem : l)
{
bool found = false;
for (auto& attr : baseList)
{
if (typeid(*litem) != typeid(*attr)) continue;
attr = litem;
found = true;
break;
}
if (!found)
{
v.push_back(litem);
}
}
}
您还可以利用标准算法来避免有状态的found
多变的:
void updateBaseList(std::vector<Attribute*>& v, std::initializer_list<Attribute*> l)
{
for (auto& litem : l)
{
const auto found = std::find_if(std::begin(v), std::end(v), [&](Attribute* p)
{
return typeid(*litem) == typeid(*p);
});
if (found == std::end(v))
{
v.push_back(litem);
}
else
{
*found = litem;
}
}
}