这些条件是:
// A hierarchy
struct Base {
virtual void everyone_has_this() = 0;
};
struct DA : Base {
void everyone_has_this() override {...}
};
struct DB : Base {
void everyone_has_this() override {...}
void only_db_has_this() {...}
};
// And some vectors
vector<DA> das (3);
vector<DB> dbs (2);我很想能用这样的东西:
// Foreach all of them in one loop
for(Base& o : view_as_one<Base>(das, dbs)) {
o.everyone_has_this();
}
// Or just several types of them
for(DB& o : dbs) {
db.only_db_has_this();
}问题是:这有可能吗?
如果不是,那么一个循环的其他方法是什么,而不是每个容器呢?
重要的是,我不想摆脱隔离和存储的连续性。
如果我使用单个基本指针容器,dynamic_cast就可以工作,但它需要在每次迭代中检查类型,目标是将所有对象存储在相邻的存储库中。
编辑:替代解决方案如果boost不是选项或视图是不够的
虽然我很喜欢M.S.的解决方案,因为他实现了我所要求的接口,但我发现这个接口实际上并不灵活(不能使用擦除)。
for_each_in_tuple(std::tie(das, dbs), [](auto& cont){
for(auto& obj : cont) {
// do what you want
}
// or even
cont.erase(std::remove_if(begin(cont), end(cont), [](auto& obj) {
// also do what you want
}, end(cont));
});auto&)。<tuple> =>,而不是boost &编译速度更快。发布于 2016-07-23 13:41:35
是的,这是可能的。只需编写一些代码就可以了。
只需实现view_as_one,使其满足C++库容器的要求;或者至少满足实现此功能所需的最低要求。它的构造函数存储对组成容器、底层容器的引用。将其iterator类按顺序在每个组成容器上迭代。实现view_as_one<T>::begin()和view_as_one<T>::end()。好了。
我希望在一个典型的“高级C++”编程类中把这看作是一项家庭作业。
https://stackoverflow.com/questions/38542397
复制相似问题