首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建抽象包装器迭代器

创建抽象包装器迭代器
EN

Stack Overflow用户
提问于 2014-09-01 15:09:53
回答 1查看 125关注 0票数 0

假设我有两种类型的矩阵: reg和sparse。我创建了一个抽象的父类"Matrix",上面的两个继承自"Matrix“。我想创建一个抽象迭代器,这样"MatrixIterator“是父抽象类,"RegMatrixIterator","SparseMatrixIterator”继承自它。总而言之,6个班级。

RegMatrix保存向量表示,SparseMatrix保存在索引对和值之间映射的映射。

实现迭代器的最佳方式是什么?

EN

回答 1

Stack Overflow用户

发布于 2014-09-01 17:15:14

iterator是一种抽象元素实际存储方式细节的通用机制。由于通用的面向对象编程( OOP )不能很好地协同工作,迭代器通常不会通过OOP实现。

我不知道你为什么要为你的Matrix使用OOP,也就是说,你是否真的想在矩阵上使用运行时多态性。如果这真的很重要,那么您将需要多态的Matrix::begin()Matrix::end(),因此需要多态的Matrix::iterator。使用这样的矩阵的代码将如下所示

代码语言:javascript
复制
#include <Matrix.hpp>
void foo(Matrix const&m)
{
  for(a : m) { [...] }
}

但是,对于Matrix::iterator的多态方法的每次调用,您都需要付出虚拟函数调用(虚拟表查找)的代价。如果这不是性能关键型的,这种类型的设计是可以的,尽管对于迭代器来说并不常见。

但是,我更喜欢泛型编程方法,即这两种矩阵类型可以从公共基础派生,但不是为了运行时多态性的目的。然后每种类型只有它自己的迭代器类型和它自己的非虚拟begin()end()。使用这样的矩阵的代码将如下所示

代码语言:javascript
复制
#include <Matrix.hpp>
template<typename Matrix>
typename std::enable_if<is_Matrix<Matrix>::value>:: // is_Matrix defined in Matrix.hpp
type foo(Matrix const&m)
{
  for(x : m) { [...] }
}

您可以简单地static_assert()正确的矩阵类型,而不是SFINAE (std::enable_if),尽管这样您的函数可能与另一个foo(some_arg)有歧义。

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

https://stackoverflow.com/questions/25600531

复制
相关文章

相似问题

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