gpt4 book ai didi

c++ - 多态转换迭代器

转载 作者:太空狗 更新时间:2023-10-29 20:26:58 25 4
gpt4 key购买 nike

考虑以下(简化的)场景:

class edgeOne {
private:
...
public:
int startNode();
int endNode();
};

class containerOne {
private:
std::vector<edgeOne> _edges;
public:
std::vector<edgeOne>::const_iterator edgesBegin(){
return _edges.begin();
};
std::vector<edgeOne>::const_iterator edgesEnd(){
return _edges.end();
};
};

class edgeTwo {
private:
...
public:
int startNode();
int endNode();
};

class containerTwo {
private:
std::vector<edgeTwo> _edges;
public:
std::vector<edgeTwo>::const_iterator edgesBegin(){
return _edges.begin();
};
std::vector<edgeTwo>::const_iterator edgesEnd(){
return _edges.end();
};
};

即,我有两个基本相同的边缘类型和两个基本相同的容器类型。我可以单独迭代每一种。到目前为止,一切顺利。

但现在我的用例如下:根据某些标准,我得到一个 containerOne 或一个 containerTwo 对象。我需要遍历边缘。但是由于类型不同,如果不重复代码,我无法轻松这样做。

所以我的想法如下:我想要一个具有以下属性的迭代器: - 关于它的遍历行为,它的行为类似于 std::vector<edgeOne>::const_iteratorstd::vector<edgeTwo>::const_iterator ,取决于它是如何初始化的。 - 而不是返回 const edgeOne &const edgeTwo & , operator*应该返回 std::pair<int,int> ,即应用转换。

我找到了 Boost.Iterator Library ,特别是:

  • iterator_facade,有助于构建符合标准的迭代器和
  • transform_iterator,可用于转换edgeOneedgeTwostd::pair<int,int> ,但我不完全确定完整的解决方案应该是什么样子。如果我自己构建几乎整个迭代器,使用 transform_iterator 有什么好处,还是只会使解决方案更重量级?

我想迭代器只需要存储以下数据:

  • 一个标志(bool 目前就足够了,但如果需要,枚举值可能更容易扩展)指示值类型是 edgeOne 还是 edgeTwo。
  • A union具有两种迭代器类型的条目(其中只有与标志匹配的那个才会被访问)。

任何其他东西都可以即时计算。

我想知道是否存在针对此多态行为的现有解决方案,即迭代器实现将两个(或更多)具有相同值类型的底层迭代器实现组合在一起。如果存在这样的东西,我可以用它来组合两个 transform_iterator

调度(即决定是否需要访问 containerOne 或 containerTwo 对象)可以通过独立函数轻松完成...

关于这个问题有什么想法或建议吗?

最佳答案

让你的 edgeOne 和 edgeTwo 多态怎么样?并在容器中使用指针?

class edge
class edgeOne : public edge
class edgeTwo : public edge

std::vector<edge*>

关于c++ - 多态转换迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17721529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com