【问题标题】:Documenting a C++ concept using doxygen? [closed]使用 doxygen 记录 C++ 概念? [关闭]
【发布时间】:2012-04-10 10:38:28
【问题描述】:

有没有一种方便的方法可以在 doxygen 中记录 C++ 概念?我想要一些像this in the boost documentation 这样的文档。

【问题讨论】:

    标签: c++ documentation doxygen


    【解决方案1】:

    在与 Doxygen 斗争了一番之后,我终于找到了以下解决方案。

    1. 为您的概念定义一个组:使用页面是不合适的,因为一个页面应该指示其子页面(从树的顶部到底部),而组表示可能有许多父组。这允许:

      • 向一个(或多个)父概念添加一个概念,而不改变父概念本身(概念的细化/概括)
      • 将实体链接到多个概念,而不更改概念本身(例如,将类添加到实现特定概念的库时)

      例子

      /*!@defgroup measurement_functor_concepts Measurement function objects
       * @ingroup generalconcepts
       * @{
       * @par Description
       * blablabla
       *
       * @par Notations
       * Let @c F be the type of the function object, @c f an instance.
       *
       * @par Valid Expressions
       * - @c f function object is ...
       * - <b>f.result()</b> returns ...
       * @}
       */
      
    2. 使用一个参数定义自定义命令concept

      ALIASES += concept{1}="@ingroup \1\n@par Implemented concepts:\n@ref \1"
      

      命令:

      • 将实体包含在定义概念的组中:实体将出现在概念的文档中(实体可能出现在多个组中)
      • 添加带有Implemented concepts 的段落,以提供指向已实施概念的链接。
    3. 表明一个特定的类/结构实现了这个概念:

      //!@brief Does things...
      //!@concept{measurement_functor_concepts}
      template <class T>
      struct my_struct: public std::unary_function<T, void> {};
      

    我没有找到一种方法来生成像 Boost 中那样的好文档(有效表达式的好表等),但至少这种文档组织可以正确地分离事物。

    【讨论】:

      【解决方案2】:

      您可以做的是定义一个名为 Concept 的自定义标签,然后您可以按照您的描述使用它。其中一个example 是使用 Doxygen 中的别名机制,类似于:

      ALIASES += "con=\xrefitem con \"Concept\" \"Concepts\" "

      【讨论】:

      • 很抱歉,但定义别名如何有助于记录概念并不明显。您能否扩展这个答案,也许举个例子?
      【解决方案3】:

      您可以使用\tparamtemplate parameters 发表评论/记录。

      【讨论】:

      • 我可以用 '\tparam' 来表示实例化这个模板参数的类应该按照 xyz 的概念来实现。但是如何记录概念本身呢?
      • 不确定我是否了解您要查找的内容。您可以创建一个\note 说 xyz 概念是某某,但这可能不是为该概念本身编写文档的最佳位置。如果您有一个实际的概念类/结构,您可以为它编写文档,就像为任何其他类编写文档一样
      • 由于无法使用 C++ 指定概念(到目前为止),因此没有描述该概念的类(或文件)。只有实现它的类。我想知道是否有一种既定的方法可以规避这一点,并在我的 doxygen 输出中包含概念文档。
      • 你可以看看this SO thread。另请注意 doxygen 中的 grouping 用于概念的“实例”
      【解决方案4】:

      我目前使用单独的手册页来记录概念并将 \section\subsection 分组。然后我可以使用\ref 链接到他们。只要您在提供的链接中使用表格描述概念,这就会起作用,但遗憾的是不会启用指向单个部分的链接。

      我还有一个别名来创建类型模型的概念列表。

      【讨论】:

      • +1 因为您的回答帮助我参考了我的部分。
      【解决方案5】:

      我建议你考虑以下几点:

      a) 查看 Boost 概念检查库的文档。本文档向您展示了如何创建一个可在您的代码中使用的类,以验证 at 类型实际上满足您要定义的概念的要求。你可以这样使用它:

      template<typename T>
      my_class{
        MyConcept(T); // provokes compile error if T does not match concept
        T m_t;
      };
      

      仅供参考,用于创建概念检查类的元素与概念精简版提案之间存在一对一的对应关系。因此,当概念精简版真正起作用时,过渡应该很容易。

      b) 现在使用 DOxygen 记录 MyConcept 检查类!!!

      c) 在 my_class 文档中使用 DOxygen /tparam 来参考 MyConcept

      c) 所以现在你得到了你想要的东西!!! - 您的概念的单独页面,以及从需要该概念的所有课程中引用它的能力。

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2020-07-21
        相关资源
        最近更新 更多