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

时间:2015-09-06 14:26:39

标签: c++ templates iterator

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

现在,我希望通过返回向量的迭代器来返回矩阵的迭代器。为此,我发现在typename部分中需要使用关键字public

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

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

其次,每个人都可以看到我使用std::vector来表示矩阵。 我该怎么做才能防止这些信息曝光。

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

3 个答案:

答案 0 :(得分:0)

  

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

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

  

其次,每个人都可以看到我使用向量来表示矩阵,我该怎么做才能防止信息暴露。

虽然每个人都可以看到您使用的是矢量,但这不是商业机密。你提供了一个外部世界使用的typedef,强调一个向量只是一个实现细节,如果他们不这样做,他们应该得到任何东西,在我看来。

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

我认为你不能更好地隐藏它:编译器需要知道迭代器是什么。

答案 1 :(得分:0)

首先,您需要使用类型名称,因为您使用的是依赖类型。有关详细信息,请参阅:Where and why do I have to put the “template” and “typename” keywords?

对于第二部分,您可以执行两个typedef。

中的一个在私人部分
typedef typename std::vector<T> container;

然后在公共部分你可以做

typedef typename container::iterator iterator;

你可以看到它如何编译here

答案 2 :(得分:0)

您需要在此处加入typename,因为存在推断类型T。已经询问并回答here

对于你的第二个问题,你并没有真正揭露这里的班级代表;您的班级用户不 了解基础Matrix表示是std::vector以便使用您的班级。实际上,只有当用户努力寻找它时(例如,通过编译错误),该信息才可用。即使您定义了自己的迭代器,用户仍然可以查看源代码。

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

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

在这种情况下没有直接优势,但很好地养成这种习惯。