C++元编程doxygen文档

Any*_*orn 19 c++ templates doxygen

我正在记录一些使用元编程的代码,例如:

 template<rysq::type A, rysq::type B, rysq::type C, rysq::type D, class Transform>
 struct Kernel<meta::braket<A,B,C,D>, Transform,
               typename boost::enable_if<
                   quadrature<meta::braket<A,B,C,D>, Transform> >::type>
 : Eri <Transform> {
Run Code Online (Sandbox Code Playgroud)

使用doxygen记录这种构造的好方法是什么?

Hea*_*eek 8

使用预处理器宏.这是一个来自尚未官方的Boost.XInt库的示例(目前排队等待审核以包含在Boost中):

#ifdef BOOST_XINT_DOXYGEN_IGNORE
    // The documentation should see a simplified version of the template
    // parameters.
    #define BOOST_XINT_INITIAL_APARAMS ...
    #define BOOST_XINT_CLASS_APARAMS ...
    #define BOOST_XINT_CLASS_BPARAMS other
    #define BOOST_XINT_APARAMS ...
    #define BOOST_XINT_BPARAMS other
#else
    #define BOOST_XINT_INITIAL_APARAMS \
        class A0 = parameter::void_, \
        class A1 = parameter::void_, \
        class A2 = parameter::void_, \
        class A3 = parameter::void_, \
        class A4 = parameter::void_, \
        class A5 = parameter::void_
    #define BOOST_XINT_CLASS_APARAMS class A0, class A1, class A2, class A3, \
        class A4, class A5
    #define BOOST_XINT_APARAMS A0, A1, A2, A3, A4, A5
    #define BOOST_XINT_CLASS_BPARAMS class B0, class B1, class B2, class B3, \
        class B4, class B5
    #define BOOST_XINT_BPARAMS B0, B1, B2, B3, B4, B5
#endif
Run Code Online (Sandbox Code Playgroud)

#define在您需要的任何地方使用d宏名称而不是模板参数,如下所示:

/*! \brief The integer_t class template.

This class implements the standard aribitrary-length %integer type.

[...lots more documentation omitted...]
*/
template<BOOST_XINT_INITIAL_APARAMS>
class integer_t: virtual public detail::integer_t_data<BOOST_XINT_APARAMS>,
    public detail::nan_functions<detail::integer_t_data<BOOST_XINT_APARAMS>::
    NothrowType::value, // ...lots more base classes omitted...
{
    // ...etcetera
Run Code Online (Sandbox Code Playgroud)

并将这些行放在Doxyfile中:

PREDEFINED             = BOOST_XINT_DOXYGEN_IGNORE

EXPAND_AS_DEFINED      = BOOST_XINT_INITIAL_APARAMS \
                         BOOST_XINT_CLASS_APARAMS \
                         BOOST_XINT_CLASS_BPARAMS \
                         BOOST_XINT_APARAMS \
                         BOOST_XINT_BPARAMS
Run Code Online (Sandbox Code Playgroud)

结果是Doxygen看到模板参数的"..."或"其他",编译器看到真实的.如果您在类本身的文档中描述模板参数,那么库的用户只需要在他可能寻找它们的一个地方看到它们; 他们会隐藏在其他地方.

作为此设计的另一个优点,如果您需要更改模板参数列表,则只需在宏定义和实际使用已更改参数的函数中更改它们.其他一切都会自动适应.

  • 我讨厌为doxygen添加额外的宏/代码,好像编写文档注释是不够的.希望他们能尽快支持模板. (2认同)