模板类的迭代器和信息隐藏
iterator of a template class and information hiding
假设我们有一个矩阵模板类的实现。我希望用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*
,但是当代码最终崩溃时,您真的会抱怨标准库的开发人员吗?
我认为没有比这更好的了:编译器需要知道迭代器是什么
- 正在查找文档以获得PS4平台的C++中的设备信息
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 如何设置一个范围来提取我想要获得的信息
- 结构和双指针隐藏在其他结构中,多层混淆
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 为什么 gcovr 会生成空覆盖率统计信息?
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 参数包构造函数在类模板中隐藏用户定义的转换
- Qt中的包装连接方法隐藏了编译器所需的信息
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- 我可以为 C++ 类提供不完整的标头以隐藏实现详细信息吗?
- 使用TDD时隐藏文件访问实现详细信息
- 信息隐藏C++
- 为什么在发布模式下调试会隐藏信息
- 向Doxygen隐藏模板实现详细信息
- 通过内部指针隐藏实现详细信息
- 模板类的迭代器和信息隐藏