假设我想使用typedef在源文件中定义带有自定义散列和比较器函数的新集MyTypeSet。我想隐藏源文件中的所有实现细节。
typedef std::unordered_set<MyType, MyTypeHash, MyTypeKeyEqual>
MyTypeSet;
然后我想在头文件中声明MyTypeSet以供其他模块使用。但我不想公开MyTypeHash和MyTypeKeyEqual
无法弄清楚正确的语法。
答案 0 :(得分:3)
使用typedef
无法做到这一点。 MyTypeSet
的用户需要能够查看MyType
,MyTypeHash
和MyTypeKeyEqual
的完整定义,以便了解如何编译MyTypeSet
。
有一些方法可用于将模板化代码的公共接口与实现细节区分开来:
detail
,private
或类似名称的命名空间中。 MyTypeHash_
中所示。 (这可以在MSVC标准库中看到一点点。)如果绝对必须保持MyTypeHash
和MyTypeKeyEqual
的秘密,那么可以将MyTypeSet
声明为只具有最终用户所需方法的类。然后MyTypeSet
可以使用pImpl idiom将std::unordered_set
作为成员变量仅在源文件中可见。 MyTypeSet
的所有方法都可以通过调用std::unordered_set
来实现。
这样的MyTypeSet
不能与std::unordered_set
具有完全相同的公共接口,因为std::unordered_set
将其哈希和键类型公开为成员类型。