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

时间:2018-04-26 23:47:30

标签: c++ typedef

假设我想使用typedef在源文件中定义带有自定义散列和比较器函数的新集MyTypeSet。我想隐藏源文件中的所有实现细节。

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

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

无法弄清楚正确的语法。

1 个答案:

答案 0 :(得分:3)

使用typedef无法做到这一点。 MyTypeSet的用户需要能够查看MyTypeMyTypeHashMyTypeKeyEqual的完整定义,以便了解如何编译MyTypeSet

有一些方法可用于将模板化代码的公共接口与实现细节区分开来:

  • 将实现细节放在公共标题中包含的另一个标题(“MyTypeImpl.hpp”)中。
  • 将私有实现类型放在名为detailprivate或类似名称的命名空间中。
  • 使用下划线字符对私人名称进行管理,如MyTypeHash_中所示。 (这可以在MSVC标准库中看到一点点。)

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

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