首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将容器视为一体

将容器视为一体
EN

Stack Overflow用户
提问于 2016-07-23 13:37:12
回答 1查看 110关注 0票数 1

这些条件是:

代码语言:javascript
复制
// 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);

我很想能用这样的东西:

代码语言:javascript
复制
// 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.的解决方案,因为他实现了我所要求的接口,但我发现这个接口实际上并不灵活(不能使用擦除)。

代码语言:javascript
复制
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 &编译速度更快。
  • (+)不受限制(例如可以使用擦除)
  • (?)不确定,但看起来msvc2015也可以编译。 注意: 有大量的for_each元组算法。我拍了这个: http://pastebin.com/6e8gmZZA
EN

回答 1

Stack Overflow用户

发布于 2016-07-23 13:41:35

是的,这是可能的。只需编写一些代码就可以了。

只需实现view_as_one,使其满足C++库容器的要求;或者至少满足实现此功能所需的最低要求。它的构造函数存储对组成容器、底层容器的引用。将其iterator类按顺序在每个组成容器上迭代。实现view_as_one<T>::begin()view_as_one<T>::end()。好了。

我希望在一个典型的“高级C++”编程类中把这看作是一项家庭作业。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38542397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档