【问题标题】:What is the use case of boost::hana forward declaration headers?boost::hana 前向声明标头的用例是什么?
【发布时间】:2018-07-16 08:04:00
【问题描述】:

大多数hana 标头还包括包含在子文件夹fwd 中的前向声明标头,例如#include<boost/hana/fwd/pair.hpp

AFAIK 前向声明标头声明事物而不是定义事物,因此用户可以对函数和对象的指针(和引用)进行访问。

它对boost::hana 有什么意义,这是一个仅包含标头的模板库?我唯一想到的是,如果您不打算实例化已声明的模板,前向声明就足够了,但是 - 首先使用它们有什么意义?

通过查看库源,我觉得它非常聪明,但我仍然不理解。


想象一下,我只需要非常具体的 boost::hana 模板实例。如果我在一个翻译单元中定义并实例化它们,并使用前向声明从所有其他单元链接到它们,它会起作用吗?

【问题讨论】:

    标签: c++ boost metaprogramming forward-declaration boost-hana


    【解决方案1】:

    手册here有这方面的一点信息:

    此子目录包含所有内容的前向声明 这 图书馆。它本质上是boost/hana/ 目录的镜像,除了 所有标头仅包含前向声明和文档。为了 例如,要包含hana::tuple 容器,可以使用 boost/hana/tuple.hpp 标头。但是,如果一个人只想要 该容器的前向声明,boost/hana/fwd/tuple.hpp 可以改用标头。请注意,标头的前向声明 boost/hana/ext/boost/hana/functional/ 中未提供。

    同样来自与作者here的讨论:

    理由是我们可以#include 轻量级声明 当只需要声明时,而不是完整的定义。 这有助于编译时间。此外,对于某些人来说,这是必要的 循环依赖的东西。

    和:

    最后,我认为它可以很好地分离界面 和实施,并且它也提供了一个系统地放置的地方 文档。由于实施有时很麻烦,我认为 最好不要把文档和它纠缠在一起。

    它直接来自马的嘴。我发现非常有必要将具有循环依赖关系的整个鸡/蛋问题的实现分开。这是我在自己的项目中采用的一种干净的方式。

    【讨论】:

    • 虽然循环依赖显然需要前向声明(以及扩展的 fwd 标头)。然而,我认为公平地说这不是一个好的默认做法(因为循环依赖通常是一种设计气味;像 Hana 这样的库是一个高度特定的子类型,因此可能是一个例外)。 +1 顺便回答一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2020-02-18
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多