模板类的迭代器和信息隐藏

iterator of a template class and information hiding

本文关键字:信息 隐藏 迭代器      更新时间:2023-10-16

假设我们有一个矩阵模板类的实现。我希望用T类型的std::vector来表示矩阵。

现在,我希望通过返回vector的迭代器来返回矩阵的迭代器。为此,我看到在public部分需要使用关键字typename:

typedef typename std::vector<T>::iterator iterator.

首先,我不明白为什么这里需要typename

其次,每个人都可以看到我使用std::vector来表示矩阵。我能做些什么来防止这些信息暴露呢?

我如何在不暴露矩阵表示的情况下实现这个目标?

首先,由于您使用的是依赖类型,因此需要在那里使用typename。有关这方面的更多信息,请参阅:为什么我必须把" template "answers" typename "关键字放在哪里?

对于第二部分,您可以使用两个类型定义。一个在私有部分,即

typedef typename std::vector<T> container;

然后在public部分你可以输入

typedef typename container::iterator iterator;

你可以看到这里是如何编译的

这里需要包含typename,因为存在一个推断类型T。这个问题在这里已经被问过了。

对于你的第二个问题,你在这里并没有真正暴露类的表示;为了使用您的类,您的类的用户不需要来理解底层矩阵表示是std::vector。实际上,只有当用户花了一些精力去寻找它(例如,通过编译错误)时,这些信息才可用。即使你定义了自己的迭代器,用户仍然可以直接查看你的源代码。

最后,如果你使用的是c++ 11,更好的方法是使用别名:

using iterator = typename std::vector<T>::iterator;

在这种情况下没有立竿见影的好处,但养成这个习惯是有益的。

首先,我不明白为什么这里包含typename

例如,

typename告诉编译器iterator确实是一个类型,而不是看起来完全相同的成员。在处理模板时需要对其进行限定,因为通常此时编译器没有足够的信息来区分它们。

第二,每个人都可以看到我用一个向量来表示矩阵,我怎么做才能防止这个信息暴露。

虽然每个人都可以看到你在使用向量,但这不是商业秘密。你为外部世界提供了一个类型定义,强调向量只是一个实现细节,如果他们不这样做,他们应该得到什么,在我看来。

为了强调这一点,vector<T>::iterator也是一个类型定义,在一些编译器中,当你用不同的标志编译时,它意味着不同的东西。有时您可以查找并在任何地方使用T*,但是当代码最终崩溃时,您真的会抱怨标准库的开发人员吗?

我认为没有比这更好的了:编译器需要知道迭代器是什么