大多数hana标头还包括子文件夹fwd
中包含的前向声明标头,例如#include<boost/hana/fwd/pair.hpp
。
AFAIK前向声明标头声明事物而不是定义事物,因此用户可以限制对函数和对象的指针(和引用)访问。
这对boost::hana
(仅用于标头的模板库)有何意义?我唯一想到的是,如果您不打算实例化已声明的模板,那么前向声明就足够了,但是-首先使用它们的意义是什么?
通过查看库资源,我觉得它非常聪明,我仍然不理解。
想象一下,我只需要boost::hana
模板的非常具体的实例。如果我在一个翻译单元中定义并将其实例化,并使用前向声明从所有其他单元链接到它们,是否可行?
答案 0 :(得分:3)
here手册中对此有一些信息:
此子目录包含所有内容的前向声明 的 图书馆。它本质上是
boost/hana/
目录的镜像,除了 所有标题仅包含前向声明和文档。对于 例如,要包含hana::tuple
容器,可以使用boost/hana/tuple.hpp
标头。但是,如果只想要 该容器的前向声明boost/hana/fwd/tuple.hpp
标头可以代替使用。请注意,标题的前向声明boost/hana/ext/
和boost/hana/functional/
中没有提供。
也来自与作者here的讨论:
基本原理是,我们可以#include轻量级声明 仅要求声明时,而不是完整定义。 这有助于编译时间。另外,对于某些 循环依赖的东西。
和:
最后,我认为它可以很好地分隔界面 和实施,也为系统地放置 文档。由于实施有时是繁琐的,我认为 最好不要将文档与文档纠缠在一起。
从马口直接出来。我发现,对于具有循环依赖关系的整个鸡肉/鸡蛋问题,将实现分开是非常必要的。这是我在自己的项目中采用的一种干净的方法。