创建抽象包装器迭代器

时间:2014-09-01 07:09:53

标签: c++ inheritance iterator polymorphism abstract

说我有两种类型的矩阵:reg和稀疏。 我创建了一个抽象的父类" Matrix",上面的两个继承自" Matrix"。 我想创建一个抽象迭代器,以便" MatrixIterator"是父抽象类," RegMatrixIterator"," SparseMatrixIterator"继承它。所有6个班级都有。

RegMatrix保存一个矢量表示,SparseMatrix保存一个映射,该映射在索引对和值之间进行映射。

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

1 个答案:

答案 0 :(得分:1)

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

我不知道你为什么要为你Matrix使用OOP,即你是否真的想在矩阵上使用运行时多态。如果这非常重要,那么您将需要多态Matrix::begin()Matrix::end(),因此需要多态Matrix::iterator。使用这种矩阵的代码看起来像

#include <Matrix.hpp>
void foo(Matrix const&m)
{
  for(a : m) { [...] }
}

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

但是,我更喜欢通用编程方法,其中两种矩阵类型可以从公共基础派生,但不是为了运行时多态性的目的。然后每个类型只有自己的迭代器类型和自己的非虚拟begin()end()。使用这种矩阵的代码看起来像

#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) { [...] }
}

而不是SFINAE(std::enable_if),您可能只是static_assert()正确的矩阵类型 那么你的函数可能与另一个foo(some_arg)不明确。