如何使用doxygen记录C++模板和模板元函数?

mar*_*ark 54 c++ templates doxygen

是否有关于如何使用Doxygen记录C++模板和模板元函数的指南?

例如:

/// @brief metafunction for generation of a map of message types to
/// their associated callbacks.
/// @tparam Seq the list of message types
template< class Seq >
struct generate_callback_map
{
    typedef typename mpl::transform< Seq
                                   , build_type_signature_pair< mpl::_1 > 
                                   >::type vector_pair_type;
    typedef typename fusion::result_of::as_map< vector_pair_type >::type type;
};
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经看到了以下建议:

  • @tparam 用于记录模板参数.
  • @arg 记录模板参数的替代方法.
  • @brief 用于描述元功能.

如何记录元函数的"返回类型"?

有没有人对使用Doxygen和C++模板有任何好的建议或个人喜好?

Dav*_*men 49

使用@tparam模板参数,@arg函数参数.对于返回值,@return.这里没有回报.只有typedefs.

顺便说一句,您的示例代码看起来不像元函数.元功能是毛茸茸的野兽,它利用SFINAE做一些C++本来不打算做的事情(例如,反射).您generate_callback_map只是看起来像模板typedef的C++ 03替身.

您缺少的是关于typedef的文档以及有关如何使用此模板的文档.

/// @brief metafunction for generation of a map of message types to
/// their associated callbacks.
/// @details
/// Usage: Use <tt>generate_callback_map<Type>::type</tt> to ...
/// @tparam Seq the list of message types
/// 
template< class Seq >
struct generate_callback_map
{
  /// @brief It's a good idea to document all of your typedefs.
  typedef typename mpl::transform< Seq
                                 , build_type_signature_pair< mpl::_1 > 
                                 >::type vector_pair_type;

  /// @brief This is why generate_callback_map exists. Document it!
  typedef typename fusion::result_of::as_map< vector_pair_type >::type type;
};
Run Code Online (Sandbox Code Playgroud)

  • 在C++中,"元函数"通常指的是诸如OP之类的代码.是的,它是一个typedef,但是typedef包含的类型是评估指定的编译时"函数"的结果. (8认同)
  • 我会争辩说这里没有回头路.正式类没有返回值,但逻辑上`type` typedef是一个返回值.并且在类的主要文档主体中比作为单独的成员更好地记录. (6认同)
  • 有人可能会说这里有回报,从这个意义上说,这个结构定义是一个函数。但是从Doxygen和相关/兼容的doc生成器的角度来看,尝试在示例中使用@return标记任何内容只会使它感到困惑。@david的示例typedef文档提供了此功能,并且毫不含糊,但是可以通过有关结构本身的简短文档来进行扩充。 (2认同)
  • Doxygen文档上指向“ tparam”的最新链接:http://www.doxygen.nl/manual/commands.html#cmdtparam (2认同)

Ant*_*ine 21

我不认为有可能使用带有doxygen的文档高级模板构造,因为它最初是为面向对象的范例设计的而不是元编程.作为一个例子,GNU STL(libstdc ++)使用doxygen,但在STL中记录元编程的工作很差.

另一方面,boost使用自己的工具:QuickBook使用独立的文本文件和doxygen文档源生成BoostBook标记(DocBook的扩展),然后生成html/pdf.该结果是比的libstdc更多的信息++但显然涉及从开发多一点的工作.

由于boost文档可以说是最好的元编程之一,你可以走这条路,特别是因为它补充了doxygen - 你可以重用你现有的标记.

虽然它没有完全回答你的问题,但你可能会对最近的铿锵发展感兴趣.使用--with-extra-options=-Wdocumentation它构建clang 语义时会使用您的代码检查doxygen标记并生成文档警告.强制您保持文档/代码同步.

  • @Antoine - Eigen,一个.Eigen非常模糊.它们的API由doxygen自动生成.他们的API文档是否独立存在?当然不是.对于任何足够复杂的软件包,API都不够.想想C++标准库.需要多本书来描述该库.这里只是Eigen源代码的一个例子:[Matrix.h,Eigen release 3.1](https://bitbucket.org/eigen/eigen/src/2afa6f331fdc61f3dee9ee0dd5b5d11123a665ce/Eigen/src/Core/Matrix.h?at=default) . (4认同)
  • 这里的信息非常好。Clang/LLVM 文档检查链接非常有用!我只需要使用`-Wdocumentation` 来让它工作。不过,并没有严格回答 OP 的问题。 (2认同)
  • Re"作为一个例子,GNU STL(libstdc ++)使用doxygen但在STL中记录元编程的工作很差." GNU在记录期间表现不佳.看一下源代码.存在的小评论充其量只是穷人.使用GNU糟糕的评论作为doxygen失败的一个例子是不公平的.一个更好的例子是一些评论良好的来源,尽管如此,在doxygen中看起来很糟糕. (2认同)