在C ++中,当在源文件中定义数据结构时,如何在头文件中声明数据结构?

Hao Shen

假设我要使用typedef来定义新集MyTypeSet,并在源文件中使用自定义的哈希和比较器函数。我想在源文件中隐藏所有实施细节。

typedef std::unordered_set<MyType, MyTypeHash, MyTypeKeyEqual>
MyTypeSet;

然后,我想在头文件中声明MyTypeSet,以供其他模块使用。但是我不想公开MyTypeHash和MyTypeKeyEqual

只是找不到正确的语法。

杰克C.

无法使用完成此操作typedef用户MyTypeSet需要能够看到完整的定义MyTypeMyTypeHash以及MyTypeKeyEqual为了知道如何编译MyTypeSet

有几种方法用于从实现细节中区分模板化代码的公共接口:

  • 将实现详细信息放在公共标头中包含的另一个标头(“ MyTypeImpl.hpp”)中。
  • 把私人实现类型在一个名为命名空间detailprivate或类似的。
  • 将私有名称与下划线字符进行拼合,如中所示MyTypeHash_(这可以在MSVC标准库中看到很多)。

如果是绝对必要的,以保持MyTypeHashMyTypeKeyEqual秘密,那么可以声明MyTypeSet为一类,只有具有由最终用户所需要的方法。然后MyTypeSet可以使用pImpl惯用法使astd::unordered_set作为成员变量仅在源文件中可见。的所有方法MyTypeSet都可以通过调用来实现std::unordered_set

这样的aMyTypeSet不能具有与完全相同的公共接口std::unordered_set,因为std::unordered_set将其哈希和键类型公开为成员类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章