假设我要使用typedef来定义新集MyTypeSet,并在源文件中使用自定义的哈希和比较器函数。我想在源文件中隐藏所有实施细节。
typedef std::unordered_set<MyType, MyTypeHash, MyTypeKeyEqual>
MyTypeSet;
然后,我想在头文件中声明MyTypeSet,以供其他模块使用。但是我不想公开MyTypeHash和MyTypeKeyEqual
只是找不到正确的语法。
无法使用完成此操作typedef
。用户MyTypeSet
需要能够看到完整的定义MyType
,MyTypeHash
以及MyTypeKeyEqual
为了知道如何编译MyTypeSet
。
有几种方法用于从实现细节中区分模板化代码的公共接口:
detail
,private
或类似的。MyTypeHash_
。(这可以在MSVC标准库中看到很多)。如果是绝对必要的,以保持MyTypeHash
和MyTypeKeyEqual
秘密,那么可以声明MyTypeSet
为一类,只有具有由最终用户所需要的方法。然后MyTypeSet
可以使用pImpl惯用法使astd::unordered_set
作为成员变量仅在源文件中可见。的所有方法MyTypeSet
都可以通过调用来实现std::unordered_set
。
这样的aMyTypeSet
不能具有与完全相同的公共接口std::unordered_set
,因为std::unordered_set
将其哈希和键类型公开为成员类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句